Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
5563 | serge | 1 | /* |
2 | * Mesa 3-D graphics library |
||
3 | * |
||
4 | * Copyright (C) 2012-2013 LunarG, Inc. |
||
5 | * |
||
6 | * Permission is hereby granted, free of charge, to any person obtaining a |
||
7 | * copy of this software and associated documentation files (the "Software"), |
||
8 | * to deal in the Software without restriction, including without limitation |
||
9 | * the rights to use, copy, modify, merge, publish, distribute, sublicense, |
||
10 | * and/or sell copies of the Software, and to permit persons to whom the |
||
11 | * Software is furnished to do so, subject to the following conditions: |
||
12 | * |
||
13 | * The above copyright notice and this permission notice shall be included |
||
14 | * in all copies or substantial portions of the Software. |
||
15 | * |
||
16 | * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR |
||
17 | * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, |
||
18 | * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL |
||
19 | * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER |
||
20 | * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING |
||
21 | * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER |
||
22 | * DEALINGS IN THE SOFTWARE. |
||
23 | * |
||
24 | * Authors: |
||
25 | * Chia-I Wu |
||
26 | */ |
||
27 | |||
28 | #ifndef TOY_HELPERS_H |
||
29 | #define TOY_HELPERS_H |
||
30 | |||
31 | #include "toy_compiler.h" |
||
32 | |||
33 | /** |
||
34 | * Transpose a dst operand. |
||
35 | * |
||
36 | * Instead of processing a single vertex with each of its attributes in one |
||
37 | * register, such as |
||
38 | * |
||
39 | * r0 = [x0, y0, z0, w0] |
||
40 | * |
||
41 | * we want to process four vertices at a time |
||
42 | * |
||
43 | * r0 = [x0, y0, z0, w0] |
||
44 | * r1 = [x1, y1, z1, w1] |
||
45 | * r2 = [x2, y2, z2, w2] |
||
46 | * r3 = [x3, y3, z3, w3] |
||
47 | * |
||
48 | * but with the attribute data "transposed" |
||
49 | * |
||
50 | * r0 = [x0, x1, x2, x3] |
||
51 | * r1 = [y0, y1, y2, y3] |
||
52 | * r2 = [z0, z1, z2, z3] |
||
53 | * r3 = [w0, w1, w2, w3] |
||
54 | * |
||
55 | * This is also known as the SoA form. |
||
56 | */ |
||
57 | static inline void |
||
58 | tdst_transpose(struct toy_dst dst, struct toy_dst *trans) |
||
59 | { |
||
60 | int i; |
||
61 | |||
62 | switch (dst.file) { |
||
63 | case TOY_FILE_VRF: |
||
64 | assert(!dst.indirect); |
||
65 | for (i = 0; i < 4; i++) { |
||
66 | if (dst.writemask & (1 << i)) { |
||
67 | trans[i] = tdst_offset(dst, i, 0); |
||
68 | trans[i].writemask = TOY_WRITEMASK_XYZW; |
||
69 | } |
||
70 | else { |
||
71 | trans[i] = tdst_null(); |
||
72 | } |
||
73 | } |
||
74 | break; |
||
75 | case TOY_FILE_ARF: |
||
76 | assert(tdst_is_null(dst)); |
||
77 | for (i = 0; i < 4; i++) |
||
78 | trans[i] = dst; |
||
79 | break; |
||
80 | case TOY_FILE_GRF: |
||
81 | case TOY_FILE_MRF: |
||
82 | case TOY_FILE_IMM: |
||
83 | default: |
||
84 | assert(!"unexpected file in dst transposition"); |
||
85 | for (i = 0; i < 4; i++) |
||
86 | trans[i] = tdst_null(); |
||
87 | break; |
||
88 | } |
||
89 | } |
||
90 | |||
91 | /** |
||
92 | * Transpose a src operand. |
||
93 | */ |
||
94 | static inline void |
||
95 | tsrc_transpose(struct toy_src src, struct toy_src *trans) |
||
96 | { |
||
97 | const enum toy_swizzle swizzle[4] = { |
||
98 | src.swizzle_x, src.swizzle_y, |
||
99 | src.swizzle_z, src.swizzle_w, |
||
100 | }; |
||
101 | int i; |
||
102 | |||
103 | switch (src.file) { |
||
104 | case TOY_FILE_VRF: |
||
105 | assert(!src.indirect); |
||
106 | for (i = 0; i < 4; i++) { |
||
107 | trans[i] = tsrc_offset(src, swizzle[i], 0); |
||
108 | trans[i].swizzle_x = TOY_SWIZZLE_X; |
||
109 | trans[i].swizzle_y = TOY_SWIZZLE_Y; |
||
110 | trans[i].swizzle_z = TOY_SWIZZLE_Z; |
||
111 | trans[i].swizzle_w = TOY_SWIZZLE_W; |
||
112 | } |
||
113 | break; |
||
114 | case TOY_FILE_ARF: |
||
115 | assert(tsrc_is_null(src)); |
||
116 | /* fall through */ |
||
117 | case TOY_FILE_IMM: |
||
118 | for (i = 0; i < 4; i++) |
||
119 | trans[i] = src; |
||
120 | break; |
||
121 | case TOY_FILE_GRF: |
||
122 | case TOY_FILE_MRF: |
||
123 | default: |
||
124 | assert(!"unexpected file in src transposition"); |
||
125 | for (i = 0; i < 4; i++) |
||
126 | trans[i] = tsrc_null(); |
||
127 | break; |
||
128 | } |
||
129 | } |
||
130 | |||
131 | static inline struct toy_src |
||
132 | tsrc_imm_mdesc(const struct toy_compiler *tc, |
||
133 | bool eot, |
||
134 | unsigned message_length, |
||
135 | unsigned response_length, |
||
136 | bool header_present, |
||
137 | uint32_t function_control) |
||
138 | { |
||
139 | uint32_t desc; |
||
140 | |||
141 | assert(message_length >= 1 && message_length <= 15); |
||
142 | assert(response_length >= 0 && response_length <= 16); |
||
143 | assert(function_control < 1 << 19); |
||
144 | |||
145 | desc = eot << 31 | |
||
146 | message_length << 25 | |
||
147 | response_length << 20 | |
||
148 | header_present << 19 | |
||
149 | function_control; |
||
150 | |||
151 | return tsrc_imm_ud(desc); |
||
152 | } |
||
153 | |||
154 | static inline struct toy_src |
||
155 | tsrc_imm_mdesc_sampler(const struct toy_compiler *tc, |
||
156 | unsigned message_length, |
||
157 | unsigned response_length, |
||
158 | bool header_present, |
||
159 | unsigned simd_mode, |
||
160 | unsigned message_type, |
||
161 | unsigned sampler_index, |
||
162 | unsigned binding_table_index) |
||
163 | { |
||
164 | const bool eot = false; |
||
165 | uint32_t ctrl; |
||
166 | |||
167 | assert(simd_mode < 4); |
||
168 | assert(sampler_index < 16); |
||
169 | assert(binding_table_index < 256); |
||
170 | |||
171 | if (tc->dev->gen >= ILO_GEN(7)) { |
||
172 | ctrl = simd_mode << 17 | |
||
173 | message_type << 12 | |
||
174 | sampler_index << 8 | |
||
175 | binding_table_index; |
||
176 | } |
||
177 | else { |
||
178 | ctrl = simd_mode << 16 | |
||
179 | message_type << 12 | |
||
180 | sampler_index << 8 | |
||
181 | binding_table_index; |
||
182 | } |
||
183 | |||
184 | return tsrc_imm_mdesc(tc, eot, message_length, |
||
185 | response_length, header_present, ctrl); |
||
186 | } |
||
187 | |||
188 | static inline struct toy_src |
||
189 | tsrc_imm_mdesc_data_port(const struct toy_compiler *tc, |
||
190 | bool eot, |
||
191 | unsigned message_length, |
||
192 | unsigned response_length, |
||
193 | bool header_present, |
||
194 | bool send_write_commit_message, |
||
195 | unsigned message_type, |
||
196 | unsigned message_specific_control, |
||
197 | unsigned binding_table_index) |
||
198 | { |
||
199 | uint32_t ctrl; |
||
200 | |||
201 | if (tc->dev->gen >= ILO_GEN(7)) { |
||
202 | assert(!send_write_commit_message); |
||
203 | assert((message_specific_control & 0x3f00) == message_specific_control); |
||
204 | |||
205 | ctrl = message_type << 14 | |
||
206 | (message_specific_control & 0x3f00) | |
||
207 | binding_table_index; |
||
208 | } |
||
209 | else { |
||
210 | assert(!send_write_commit_message || |
||
211 | message_type == GEN6_DATAPORT_WRITE_MESSAGE_STREAMED_VB_WRITE); |
||
212 | assert((message_specific_control & 0x1f00) == message_specific_control); |
||
213 | |||
214 | ctrl = send_write_commit_message << 17 | |
||
215 | message_type << 13 | |
||
216 | (message_specific_control & 0x1f00) | |
||
217 | binding_table_index; |
||
218 | } |
||
219 | |||
220 | return tsrc_imm_mdesc(tc, eot, message_length, |
||
221 | response_length, header_present, ctrl); |
||
222 | } |
||
223 | |||
224 | static inline struct toy_src |
||
225 | tsrc_imm_mdesc_data_port_scratch(const struct toy_compiler *tc, |
||
226 | unsigned message_length, |
||
227 | unsigned response_length, |
||
228 | bool write_type, |
||
229 | bool dword_mode, |
||
230 | bool invalidate_after_read, |
||
231 | int num_registers, |
||
232 | int hword_offset) |
||
233 | { |
||
234 | const bool eot = false; |
||
235 | const bool header_present = true; |
||
236 | uint32_t ctrl; |
||
237 | |||
238 | assert(tc->dev->gen >= ILO_GEN(7)); |
||
239 | assert(num_registers == 1 || num_registers == 2 || num_registers == 4); |
||
240 | |||
241 | ctrl = 1 << 18 | |
||
242 | write_type << 17 | |
||
243 | dword_mode << 16 | |
||
244 | invalidate_after_read << 15 | |
||
245 | (num_registers - 1) << 12 | |
||
246 | hword_offset; |
||
247 | |||
248 | return tsrc_imm_mdesc(tc, eot, message_length, |
||
249 | response_length, header_present, ctrl); |
||
250 | } |
||
251 | |||
252 | static inline struct toy_src |
||
253 | tsrc_imm_mdesc_urb(const struct toy_compiler *tc, |
||
254 | bool eot, |
||
255 | unsigned message_length, |
||
256 | unsigned response_length, |
||
257 | bool complete, |
||
258 | bool used, |
||
259 | bool allocate, |
||
260 | unsigned swizzle_control, |
||
261 | unsigned global_offset, |
||
262 | unsigned urb_opcode) |
||
263 | { |
||
264 | const bool header_present = true; |
||
265 | uint32_t ctrl; |
||
266 | |||
267 | if (tc->dev->gen >= ILO_GEN(7)) { |
||
268 | const bool per_slot_offset = false; |
||
269 | |||
270 | ctrl = per_slot_offset << 16 | |
||
271 | complete << 15 | |
||
272 | swizzle_control << 14 | |
||
273 | global_offset << 3 | |
||
274 | urb_opcode; |
||
275 | } |
||
276 | else { |
||
277 | ctrl = complete << 15 | |
||
278 | used << 14 | |
||
279 | allocate << 13 | |
||
280 | swizzle_control << 10 | |
||
281 | global_offset << 4 | |
||
282 | urb_opcode; |
||
283 | } |
||
284 | |||
285 | return tsrc_imm_mdesc(tc, eot, message_length, |
||
286 | response_length, header_present, ctrl); |
||
287 | } |
||
288 | |||
289 | #endif /* TOY_HELPERS_H */><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>><>>>>><>><>><>><>><>>=>=>>>>>>><>> |