1 /*
2 * Copyright © 2014-2015 Broadcom
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 (including the next
12 * paragraph) shall be included in all copies or substantial portions of the
13 * Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS
21 * IN THE SOFTWARE.
22 */
23
24 #ifndef NIR_BUILDER_H
25 #define NIR_BUILDER_H
26
27 #include "util/bitscan.h"
28 #include "util/half_float.h"
29 #include "nir_control_flow.h"
30
31 #ifdef __cplusplus
32 extern "C" {
33 #endif
34
35 struct exec_list;
36
37 typedef struct nir_builder {
38 nir_cursor cursor;
39
40 /* Whether new ALU instructions will be marked "exact" */
41 bool exact;
42
43 /* Whether to run divergence analysis on inserted instructions (loop merge
44 * and header phis are not updated). */
45 bool update_divergence;
46
47 nir_shader *shader;
48 nir_function_impl *impl;
49 } nir_builder;
50
51 static inline nir_builder
nir_builder_create(nir_function_impl * impl)52 nir_builder_create(nir_function_impl *impl)
53 {
54 nir_builder b;
55 memset(&b, 0, sizeof(b));
56 b.exact = false;
57 b.impl = impl;
58 b.shader = impl->function->shader;
59 return b;
60 }
61
62 /* Requires the cursor to be inside a nir_function_impl. */
63 static inline nir_builder
nir_builder_at(nir_cursor cursor)64 nir_builder_at(nir_cursor cursor)
65 {
66 nir_cf_node *current_block = &nir_cursor_current_block(cursor)->cf_node;
67
68 nir_builder b = nir_builder_create(nir_cf_node_get_function(current_block));
69 b.cursor = cursor;
70 return b;
71 }
72
73 nir_builder MUST_CHECK PRINTFLIKE(3, 4)
74 nir_builder_init_simple_shader(gl_shader_stage stage,
75 const nir_shader_compiler_options *options,
76 const char *name, ...);
77
78 typedef bool (*nir_instr_pass_cb)(struct nir_builder *, nir_instr *, void *);
79 typedef bool (*nir_intrinsic_pass_cb)(struct nir_builder *,
80 nir_intrinsic_instr *, void *);
81
82 /**
83 * Iterates over all the instructions in a NIR function and calls the given pass
84 * on them.
85 *
86 * The pass should return true if it modified the function. In that case, only
87 * the preserved metadata flags will be preserved in the function impl.
88 *
89 * The builder will be initialized to point at the function impl, but its
90 * cursor is unset.
91 */
92 static inline bool
nir_function_instructions_pass(nir_function_impl * impl,nir_instr_pass_cb pass,nir_metadata preserved,void * cb_data)93 nir_function_instructions_pass(nir_function_impl *impl,
94 nir_instr_pass_cb pass,
95 nir_metadata preserved,
96 void *cb_data)
97 {
98 bool progress = false;
99 nir_builder b = nir_builder_create(impl);
100
101 nir_foreach_block_safe(block, impl) {
102 nir_foreach_instr_safe(instr, block) {
103 progress |= pass(&b, instr, cb_data);
104 }
105 }
106
107 if (progress) {
108 nir_metadata_preserve(impl, preserved);
109 } else {
110 nir_metadata_preserve(impl, nir_metadata_all);
111 }
112
113 return progress;
114 }
115
116 /**
117 * Iterates over all the instructions in a NIR shader and calls the given pass
118 * on them.
119 *
120 * The pass should return true if it modified the shader. In that case, only
121 * the preserved metadata flags will be preserved in the function impl.
122 *
123 * The builder will be initialized to point at the function impl, but its
124 * cursor is unset.
125 */
126 static inline bool
nir_shader_instructions_pass(nir_shader * shader,nir_instr_pass_cb pass,nir_metadata preserved,void * cb_data)127 nir_shader_instructions_pass(nir_shader *shader,
128 nir_instr_pass_cb pass,
129 nir_metadata preserved,
130 void *cb_data)
131 {
132 bool progress = false;
133
134 nir_foreach_function_impl(impl, shader) {
135 progress |= nir_function_instructions_pass(impl, pass,
136 preserved, cb_data);
137 }
138
139 return progress;
140 }
141
142 /**
143 * Iterates over all the intrinsics in a NIR shader and calls the given pass on
144 * them.
145 *
146 * The pass should return true if it modified the shader. In that case, only
147 * the preserved metadata flags will be preserved in the function impl.
148 *
149 * The builder will be initialized to point at the function impl, but its
150 * cursor is unset.
151 */
152 static inline bool
nir_shader_intrinsics_pass(nir_shader * shader,nir_intrinsic_pass_cb pass,nir_metadata preserved,void * cb_data)153 nir_shader_intrinsics_pass(nir_shader *shader,
154 nir_intrinsic_pass_cb pass,
155 nir_metadata preserved,
156 void *cb_data)
157 {
158 bool progress = false;
159
160 nir_foreach_function_impl(impl, shader) {
161 bool func_progress = false;
162 nir_builder b = nir_builder_create(impl);
163
164 nir_foreach_block_safe(block, impl) {
165 nir_foreach_instr_safe(instr, block) {
166 if (instr->type == nir_instr_type_intrinsic) {
167 nir_intrinsic_instr *intr = nir_instr_as_intrinsic(instr);
168 func_progress |= pass(&b, intr, cb_data);
169 }
170 }
171 }
172
173 if (func_progress) {
174 nir_metadata_preserve(impl, preserved);
175 progress = true;
176 } else {
177 nir_metadata_preserve(impl, nir_metadata_all);
178 }
179 }
180
181 return progress;
182 }
183
184 void nir_builder_instr_insert(nir_builder *build, nir_instr *instr);
185
186 static inline nir_instr *
nir_builder_last_instr(nir_builder * build)187 nir_builder_last_instr(nir_builder *build)
188 {
189 assert(build->cursor.option == nir_cursor_after_instr);
190 return build->cursor.instr;
191 }
192
193 /* General nir_build_alu() taking a variable arg count with NULLs for the rest. */
194 nir_def *
195 nir_build_alu(nir_builder *build, nir_op op, nir_def *src0,
196 nir_def *src1, nir_def *src2, nir_def *src3);
197
198 /* Fixed-arg-count variants to reduce size of codegen. */
199 nir_def *
200 nir_build_alu1(nir_builder *build, nir_op op, nir_def *src0);
201 nir_def *
202 nir_build_alu2(nir_builder *build, nir_op op, nir_def *src0,
203 nir_def *src1);
204 nir_def *
205 nir_build_alu3(nir_builder *build, nir_op op, nir_def *src0,
206 nir_def *src1, nir_def *src2);
207 nir_def *
208 nir_build_alu4(nir_builder *build, nir_op op, nir_def *src0,
209 nir_def *src1, nir_def *src2, nir_def *src3);
210
211 nir_def *nir_build_alu_src_arr(nir_builder *build, nir_op op, nir_def **srcs);
212
213 nir_def *
214 nir_build_tex_deref_instr(nir_builder *build, nir_texop op,
215 nir_deref_instr *texture,
216 nir_deref_instr *sampler,
217 unsigned num_extra_srcs,
218 const nir_tex_src *extra_srcs);
219
220 nir_instr *nir_builder_last_instr(nir_builder *build);
221
222 void nir_builder_cf_insert(nir_builder *build, nir_cf_node *cf);
223
224 bool nir_builder_is_inside_cf(nir_builder *build, nir_cf_node *cf_node);
225
226 nir_if *
227 nir_push_if(nir_builder *build, nir_def *condition);
228
229 nir_if *
230 nir_push_else(nir_builder *build, nir_if *nif);
231
232 void nir_pop_if(nir_builder *build, nir_if *nif);
233
234 nir_def *
235 nir_if_phi(nir_builder *build, nir_def *then_def, nir_def *else_def);
236
237 nir_loop *
238 nir_push_loop(nir_builder *build);
239
240 nir_loop *
241 nir_push_continue(nir_builder *build, nir_loop *loop);
242
243 void nir_pop_loop(nir_builder *build, nir_loop *loop);
244
245 static inline nir_def *
nir_undef(nir_builder * build,unsigned num_components,unsigned bit_size)246 nir_undef(nir_builder *build, unsigned num_components, unsigned bit_size)
247 {
248 nir_undef_instr *undef =
249 nir_undef_instr_create(build->shader, num_components, bit_size);
250 if (!undef)
251 return NULL;
252
253 nir_instr_insert(nir_before_impl(build->impl), &undef->instr);
254 if (build->update_divergence)
255 nir_update_instr_divergence(build->shader, &undef->instr);
256
257 return &undef->def;
258 }
259
260 static inline nir_def *
nir_build_imm(nir_builder * build,unsigned num_components,unsigned bit_size,const nir_const_value * value)261 nir_build_imm(nir_builder *build, unsigned num_components,
262 unsigned bit_size, const nir_const_value *value)
263 {
264 nir_load_const_instr *load_const =
265 nir_load_const_instr_create(build->shader, num_components, bit_size);
266 if (!load_const)
267 return NULL;
268
269 memcpy(load_const->value, value, sizeof(nir_const_value) * num_components);
270
271 nir_builder_instr_insert(build, &load_const->instr);
272
273 return &load_const->def;
274 }
275
276 static inline nir_def *
nir_imm_zero(nir_builder * build,unsigned num_components,unsigned bit_size)277 nir_imm_zero(nir_builder *build, unsigned num_components, unsigned bit_size)
278 {
279 nir_load_const_instr *load_const =
280 nir_load_const_instr_create(build->shader, num_components, bit_size);
281
282 /* nir_load_const_instr_create uses rzalloc so it's already zero */
283
284 nir_builder_instr_insert(build, &load_const->instr);
285
286 return &load_const->def;
287 }
288
289 static inline nir_def *
nir_imm_boolN_t(nir_builder * build,bool x,unsigned bit_size)290 nir_imm_boolN_t(nir_builder *build, bool x, unsigned bit_size)
291 {
292 nir_const_value v = nir_const_value_for_bool(x, bit_size);
293 return nir_build_imm(build, 1, bit_size, &v);
294 }
295
296 static inline nir_def *
nir_imm_bool(nir_builder * build,bool x)297 nir_imm_bool(nir_builder *build, bool x)
298 {
299 return nir_imm_boolN_t(build, x, 1);
300 }
301
302 static inline nir_def *
nir_imm_true(nir_builder * build)303 nir_imm_true(nir_builder *build)
304 {
305 return nir_imm_bool(build, true);
306 }
307
308 static inline nir_def *
nir_imm_false(nir_builder * build)309 nir_imm_false(nir_builder *build)
310 {
311 return nir_imm_bool(build, false);
312 }
313
314 static inline nir_def *
nir_imm_floatN_t(nir_builder * build,double x,unsigned bit_size)315 nir_imm_floatN_t(nir_builder *build, double x, unsigned bit_size)
316 {
317 nir_const_value v = nir_const_value_for_float(x, bit_size);
318 return nir_build_imm(build, 1, bit_size, &v);
319 }
320
321 static inline nir_def *
nir_imm_float16(nir_builder * build,float x)322 nir_imm_float16(nir_builder *build, float x)
323 {
324 return nir_imm_floatN_t(build, x, 16);
325 }
326
327 static inline nir_def *
nir_imm_float(nir_builder * build,float x)328 nir_imm_float(nir_builder *build, float x)
329 {
330 return nir_imm_floatN_t(build, x, 32);
331 }
332
333 static inline nir_def *
nir_imm_double(nir_builder * build,double x)334 nir_imm_double(nir_builder *build, double x)
335 {
336 return nir_imm_floatN_t(build, x, 64);
337 }
338
339 static inline nir_def *
nir_imm_vec2(nir_builder * build,float x,float y)340 nir_imm_vec2(nir_builder *build, float x, float y)
341 {
342 nir_const_value v[2] = {
343 nir_const_value_for_float(x, 32),
344 nir_const_value_for_float(y, 32),
345 };
346 return nir_build_imm(build, 2, 32, v);
347 }
348
349 static inline nir_def *
nir_imm_vec3(nir_builder * build,float x,float y,float z)350 nir_imm_vec3(nir_builder *build, float x, float y, float z)
351 {
352 nir_const_value v[3] = {
353 nir_const_value_for_float(x, 32),
354 nir_const_value_for_float(y, 32),
355 nir_const_value_for_float(z, 32),
356 };
357 return nir_build_imm(build, 3, 32, v);
358 }
359
360 static inline nir_def *
nir_imm_vec4(nir_builder * build,float x,float y,float z,float w)361 nir_imm_vec4(nir_builder *build, float x, float y, float z, float w)
362 {
363 nir_const_value v[4] = {
364 nir_const_value_for_float(x, 32),
365 nir_const_value_for_float(y, 32),
366 nir_const_value_for_float(z, 32),
367 nir_const_value_for_float(w, 32),
368 };
369
370 return nir_build_imm(build, 4, 32, v);
371 }
372
373 static inline nir_def *
nir_imm_vec4_16(nir_builder * build,float x,float y,float z,float w)374 nir_imm_vec4_16(nir_builder *build, float x, float y, float z, float w)
375 {
376 nir_const_value v[4] = {
377 nir_const_value_for_float(x, 16),
378 nir_const_value_for_float(y, 16),
379 nir_const_value_for_float(z, 16),
380 nir_const_value_for_float(w, 16),
381 };
382
383 return nir_build_imm(build, 4, 16, v);
384 }
385
386 static inline nir_def *
nir_imm_intN_t(nir_builder * build,uint64_t x,unsigned bit_size)387 nir_imm_intN_t(nir_builder *build, uint64_t x, unsigned bit_size)
388 {
389 nir_const_value v = nir_const_value_for_raw_uint(x, bit_size);
390 return nir_build_imm(build, 1, bit_size, &v);
391 }
392
393 static inline nir_def *
nir_imm_int(nir_builder * build,int x)394 nir_imm_int(nir_builder *build, int x)
395 {
396 return nir_imm_intN_t(build, x, 32);
397 }
398
399 static inline nir_def *
nir_imm_int64(nir_builder * build,int64_t x)400 nir_imm_int64(nir_builder *build, int64_t x)
401 {
402 return nir_imm_intN_t(build, x, 64);
403 }
404
405 static inline nir_def *
nir_imm_ivec2(nir_builder * build,int x,int y)406 nir_imm_ivec2(nir_builder *build, int x, int y)
407 {
408 nir_const_value v[2] = {
409 nir_const_value_for_int(x, 32),
410 nir_const_value_for_int(y, 32),
411 };
412
413 return nir_build_imm(build, 2, 32, v);
414 }
415
416 static inline nir_def *
nir_imm_ivec3(nir_builder * build,int x,int y,int z)417 nir_imm_ivec3(nir_builder *build, int x, int y, int z)
418 {
419 nir_const_value v[3] = {
420 nir_const_value_for_int(x, 32),
421 nir_const_value_for_int(y, 32),
422 nir_const_value_for_int(z, 32),
423 };
424
425 return nir_build_imm(build, 3, 32, v);
426 }
427
428 static inline nir_def *
nir_imm_ivec4(nir_builder * build,int x,int y,int z,int w)429 nir_imm_ivec4(nir_builder *build, int x, int y, int z, int w)
430 {
431 nir_const_value v[4] = {
432 nir_const_value_for_int(x, 32),
433 nir_const_value_for_int(y, 32),
434 nir_const_value_for_int(z, 32),
435 nir_const_value_for_int(w, 32),
436 };
437
438 return nir_build_imm(build, 4, 32, v);
439 }
440
441 nir_def *
442 nir_builder_alu_instr_finish_and_insert(nir_builder *build, nir_alu_instr *instr);
443
444 /* for the couple special cases with more than 4 src args: */
445 nir_def *
446 nir_build_alu_src_arr(nir_builder *build, nir_op op, nir_def **srcs);
447
448 /* Generic builder for system values. */
449 nir_def *
450 nir_load_system_value(nir_builder *build, nir_intrinsic_op op, int index,
451 unsigned num_components, unsigned bit_size);
452
453 #include "nir_builder_opcodes.h"
454 #undef nir_deref_mode_is
455
456 nir_def *
457 nir_type_convert(nir_builder *b,
458 nir_def *src,
459 nir_alu_type src_type,
460 nir_alu_type dest_type,
461 nir_rounding_mode rnd);
462
463 static inline nir_def *
nir_convert_to_bit_size(nir_builder * b,nir_def * src,nir_alu_type type,unsigned bit_size)464 nir_convert_to_bit_size(nir_builder *b,
465 nir_def *src,
466 nir_alu_type type,
467 unsigned bit_size)
468 {
469 return nir_type_convert(b, src, type, (nir_alu_type)(type | bit_size),
470 nir_rounding_mode_undef);
471 }
472
473 static inline nir_def *
nir_i2iN(nir_builder * b,nir_def * src,unsigned bit_size)474 nir_i2iN(nir_builder *b, nir_def *src, unsigned bit_size)
475 {
476 return nir_convert_to_bit_size(b, src, nir_type_int, bit_size);
477 }
478
479 static inline nir_def *
nir_u2uN(nir_builder * b,nir_def * src,unsigned bit_size)480 nir_u2uN(nir_builder *b, nir_def *src, unsigned bit_size)
481 {
482 return nir_convert_to_bit_size(b, src, nir_type_uint, bit_size);
483 }
484
485 static inline nir_def *
nir_b2bN(nir_builder * b,nir_def * src,unsigned bit_size)486 nir_b2bN(nir_builder *b, nir_def *src, unsigned bit_size)
487 {
488 return nir_convert_to_bit_size(b, src, nir_type_bool, bit_size);
489 }
490
491 static inline nir_def *
nir_f2fN(nir_builder * b,nir_def * src,unsigned bit_size)492 nir_f2fN(nir_builder *b, nir_def *src, unsigned bit_size)
493 {
494 return nir_convert_to_bit_size(b, src, nir_type_float, bit_size);
495 }
496
497 static inline nir_def *
nir_i2b(nir_builder * b,nir_def * src)498 nir_i2b(nir_builder *b, nir_def *src)
499 {
500 return nir_ine_imm(b, src, 0);
501 }
502
503 static inline nir_def *
nir_b2iN(nir_builder * b,nir_def * src,uint32_t bit_size)504 nir_b2iN(nir_builder *b, nir_def *src, uint32_t bit_size)
505 {
506 return nir_type_convert(b, src, nir_type_bool,
507 (nir_alu_type)(nir_type_int | bit_size),
508 nir_rounding_mode_undef);
509 }
510
511 static inline nir_def *
nir_b2fN(nir_builder * b,nir_def * src,uint32_t bit_size)512 nir_b2fN(nir_builder *b, nir_def *src, uint32_t bit_size)
513 {
514 return nir_type_convert(b, src, nir_type_bool,
515 (nir_alu_type)(nir_type_float | bit_size),
516 nir_rounding_mode_undef);
517 }
518
519 static inline nir_def *
nir_i2fN(nir_builder * b,nir_def * src,unsigned bit_size)520 nir_i2fN(nir_builder *b, nir_def *src, unsigned bit_size)
521 {
522 return nir_type_convert(b, src, nir_type_int,
523 (nir_alu_type)(nir_type_float | bit_size),
524 nir_rounding_mode_undef);
525 }
526
527 static inline nir_def *
nir_u2fN(nir_builder * b,nir_def * src,unsigned bit_size)528 nir_u2fN(nir_builder *b, nir_def *src, unsigned bit_size)
529 {
530 return nir_type_convert(b, src, nir_type_uint,
531 (nir_alu_type)(nir_type_float | bit_size),
532 nir_rounding_mode_undef);
533 }
534
535 static inline nir_def *
nir_f2uN(nir_builder * b,nir_def * src,unsigned bit_size)536 nir_f2uN(nir_builder *b, nir_def *src, unsigned bit_size)
537 {
538 return nir_type_convert(b, src, nir_type_float,
539 (nir_alu_type)(nir_type_uint | bit_size),
540 nir_rounding_mode_undef);
541 }
542
543 static inline nir_def *
nir_f2iN(nir_builder * b,nir_def * src,unsigned bit_size)544 nir_f2iN(nir_builder *b, nir_def *src, unsigned bit_size)
545 {
546 return nir_type_convert(b, src, nir_type_float,
547 (nir_alu_type)(nir_type_int | bit_size),
548 nir_rounding_mode_undef);
549 }
550
551 static inline nir_def *
nir_vec(nir_builder * build,nir_def ** comp,unsigned num_components)552 nir_vec(nir_builder *build, nir_def **comp, unsigned num_components)
553 {
554 return nir_build_alu_src_arr(build, nir_op_vec(num_components), comp);
555 }
556
557 nir_def *
558 nir_vec_scalars(nir_builder *build, nir_scalar *comp, unsigned num_components);
559
560 static inline nir_def *
nir_mov_alu(nir_builder * build,nir_alu_src src,unsigned num_components)561 nir_mov_alu(nir_builder *build, nir_alu_src src, unsigned num_components)
562 {
563 if (src.src.ssa->num_components == num_components) {
564 bool any_swizzles = false;
565 for (unsigned i = 0; i < num_components; i++) {
566 if (src.swizzle[i] != i)
567 any_swizzles = true;
568 }
569 if (!any_swizzles)
570 return src.src.ssa;
571 }
572
573 nir_alu_instr *mov = nir_alu_instr_create(build->shader, nir_op_mov);
574 nir_def_init(&mov->instr, &mov->def, num_components,
575 nir_src_bit_size(src.src));
576 mov->exact = build->exact;
577 mov->src[0] = src;
578 nir_builder_instr_insert(build, &mov->instr);
579
580 return &mov->def;
581 }
582
583 /**
584 * Construct a mov that reswizzles the source's components.
585 */
586 static inline nir_def *
nir_swizzle(nir_builder * build,nir_def * src,const unsigned * swiz,unsigned num_components)587 nir_swizzle(nir_builder *build, nir_def *src, const unsigned *swiz,
588 unsigned num_components)
589 {
590 assert(num_components <= NIR_MAX_VEC_COMPONENTS);
591 nir_alu_src alu_src = { NIR_SRC_INIT };
592 alu_src.src = nir_src_for_ssa(src);
593
594 bool is_identity_swizzle = true;
595 for (unsigned i = 0; i < num_components && i < NIR_MAX_VEC_COMPONENTS; i++) {
596 if (swiz[i] != i)
597 is_identity_swizzle = false;
598 alu_src.swizzle[i] = swiz[i];
599 }
600
601 if (num_components == src->num_components && is_identity_swizzle)
602 return src;
603
604 return nir_mov_alu(build, alu_src, num_components);
605 }
606
607 /* Selects the right fdot given the number of components in each source. */
608 static inline nir_def *
nir_fdot(nir_builder * build,nir_def * src0,nir_def * src1)609 nir_fdot(nir_builder *build, nir_def *src0, nir_def *src1)
610 {
611 assert(src0->num_components == src1->num_components);
612 switch (src0->num_components) {
613 case 1:
614 return nir_fmul(build, src0, src1);
615 case 2:
616 return nir_fdot2(build, src0, src1);
617 case 3:
618 return nir_fdot3(build, src0, src1);
619 case 4:
620 return nir_fdot4(build, src0, src1);
621 case 5:
622 return nir_fdot5(build, src0, src1);
623 case 8:
624 return nir_fdot8(build, src0, src1);
625 case 16:
626 return nir_fdot16(build, src0, src1);
627 default:
628 unreachable("bad component size");
629 }
630
631 return NULL;
632 }
633
634 static inline nir_def *
nir_ball_iequal(nir_builder * b,nir_def * src0,nir_def * src1)635 nir_ball_iequal(nir_builder *b, nir_def *src0, nir_def *src1)
636 {
637 switch (src0->num_components) {
638 case 1:
639 return nir_ieq(b, src0, src1);
640 case 2:
641 return nir_ball_iequal2(b, src0, src1);
642 case 3:
643 return nir_ball_iequal3(b, src0, src1);
644 case 4:
645 return nir_ball_iequal4(b, src0, src1);
646 case 5:
647 return nir_ball_iequal5(b, src0, src1);
648 case 8:
649 return nir_ball_iequal8(b, src0, src1);
650 case 16:
651 return nir_ball_iequal16(b, src0, src1);
652 default:
653 unreachable("bad component size");
654 }
655 }
656
657 static inline nir_def *
nir_ball(nir_builder * b,nir_def * src)658 nir_ball(nir_builder *b, nir_def *src)
659 {
660 return nir_ball_iequal(b, src, nir_imm_true(b));
661 }
662
663 static inline nir_def *
nir_bany_inequal(nir_builder * b,nir_def * src0,nir_def * src1)664 nir_bany_inequal(nir_builder *b, nir_def *src0, nir_def *src1)
665 {
666 switch (src0->num_components) {
667 case 1:
668 return nir_ine(b, src0, src1);
669 case 2:
670 return nir_bany_inequal2(b, src0, src1);
671 case 3:
672 return nir_bany_inequal3(b, src0, src1);
673 case 4:
674 return nir_bany_inequal4(b, src0, src1);
675 case 5:
676 return nir_bany_inequal5(b, src0, src1);
677 case 8:
678 return nir_bany_inequal8(b, src0, src1);
679 case 16:
680 return nir_bany_inequal16(b, src0, src1);
681 default:
682 unreachable("bad component size");
683 }
684 }
685
686 static inline nir_def *
nir_bany(nir_builder * b,nir_def * src)687 nir_bany(nir_builder *b, nir_def *src)
688 {
689 return nir_bany_inequal(b, src, nir_imm_false(b));
690 }
691
692 static inline nir_def *
nir_channel(nir_builder * b,nir_def * def,unsigned c)693 nir_channel(nir_builder *b, nir_def *def, unsigned c)
694 {
695 return nir_swizzle(b, def, &c, 1);
696 }
697
698 static inline nir_def *
nir_channels(nir_builder * b,nir_def * def,nir_component_mask_t mask)699 nir_channels(nir_builder *b, nir_def *def, nir_component_mask_t mask)
700 {
701 unsigned num_channels = 0, swizzle[NIR_MAX_VEC_COMPONENTS] = { 0 };
702
703 for (unsigned i = 0; i < NIR_MAX_VEC_COMPONENTS; i++) {
704 if ((mask & (1 << i)) == 0)
705 continue;
706 swizzle[num_channels++] = i;
707 }
708
709 return nir_swizzle(b, def, swizzle, num_channels);
710 }
711
712 static inline nir_def *
_nir_select_from_array_helper(nir_builder * b,nir_def ** arr,nir_def * idx,unsigned start,unsigned end)713 _nir_select_from_array_helper(nir_builder *b, nir_def **arr,
714 nir_def *idx,
715 unsigned start, unsigned end)
716 {
717 if (start == end - 1) {
718 return arr[start];
719 } else {
720 unsigned mid = start + (end - start) / 2;
721 return nir_bcsel(b, nir_ilt_imm(b, idx, mid),
722 _nir_select_from_array_helper(b, arr, idx, start, mid),
723 _nir_select_from_array_helper(b, arr, idx, mid, end));
724 }
725 }
726
727 static inline nir_def *
nir_select_from_ssa_def_array(nir_builder * b,nir_def ** arr,unsigned arr_len,nir_def * idx)728 nir_select_from_ssa_def_array(nir_builder *b, nir_def **arr,
729 unsigned arr_len, nir_def *idx)
730 {
731 return _nir_select_from_array_helper(b, arr, idx, 0, arr_len);
732 }
733
734 static inline nir_def *
nir_vector_extract(nir_builder * b,nir_def * vec,nir_def * c)735 nir_vector_extract(nir_builder *b, nir_def *vec, nir_def *c)
736 {
737 nir_src c_src = nir_src_for_ssa(c);
738 if (nir_src_is_const(c_src)) {
739 uint64_t c_const = nir_src_as_uint(c_src);
740 if (c_const < vec->num_components)
741 return nir_channel(b, vec, c_const);
742 else
743 return nir_undef(b, 1, vec->bit_size);
744 } else {
745 nir_def *comps[NIR_MAX_VEC_COMPONENTS];
746 for (unsigned i = 0; i < vec->num_components; i++)
747 comps[i] = nir_channel(b, vec, i);
748 return nir_select_from_ssa_def_array(b, comps, vec->num_components, c);
749 }
750 }
751
752 /** Replaces the component of `vec` specified by `c` with `scalar` */
753 static inline nir_def *
nir_vector_insert_imm(nir_builder * b,nir_def * vec,nir_def * scalar,unsigned c)754 nir_vector_insert_imm(nir_builder *b, nir_def *vec,
755 nir_def *scalar, unsigned c)
756 {
757 assert(scalar->num_components == 1);
758 assert(c < vec->num_components);
759
760 nir_op vec_op = nir_op_vec(vec->num_components);
761 nir_alu_instr *vec_instr = nir_alu_instr_create(b->shader, vec_op);
762
763 for (unsigned i = 0; i < vec->num_components; i++) {
764 if (i == c) {
765 vec_instr->src[i].src = nir_src_for_ssa(scalar);
766 vec_instr->src[i].swizzle[0] = 0;
767 } else {
768 vec_instr->src[i].src = nir_src_for_ssa(vec);
769 vec_instr->src[i].swizzle[0] = i;
770 }
771 }
772
773 return nir_builder_alu_instr_finish_and_insert(b, vec_instr);
774 }
775
776 /** Replaces the component of `vec` specified by `c` with `scalar` */
777 static inline nir_def *
nir_vector_insert(nir_builder * b,nir_def * vec,nir_def * scalar,nir_def * c)778 nir_vector_insert(nir_builder *b, nir_def *vec, nir_def *scalar,
779 nir_def *c)
780 {
781 assert(scalar->num_components == 1);
782 assert(c->num_components == 1);
783
784 nir_src c_src = nir_src_for_ssa(c);
785 if (nir_src_is_const(c_src)) {
786 uint64_t c_const = nir_src_as_uint(c_src);
787 if (c_const < vec->num_components)
788 return nir_vector_insert_imm(b, vec, scalar, c_const);
789 else
790 return vec;
791 } else {
792 nir_const_value per_comp_idx_const[NIR_MAX_VEC_COMPONENTS];
793 for (unsigned i = 0; i < NIR_MAX_VEC_COMPONENTS; i++)
794 per_comp_idx_const[i] = nir_const_value_for_int(i, c->bit_size);
795 nir_def *per_comp_idx =
796 nir_build_imm(b, vec->num_components,
797 c->bit_size, per_comp_idx_const);
798
799 /* nir_builder will automatically splat out scalars to vectors so an
800 * insert is as simple as "if I'm the channel, replace me with the
801 * scalar."
802 */
803 return nir_bcsel(b, nir_ieq(b, c, per_comp_idx), scalar, vec);
804 }
805 }
806
807 static inline nir_def *
nir_replicate(nir_builder * b,nir_def * scalar,unsigned num_components)808 nir_replicate(nir_builder *b, nir_def *scalar, unsigned num_components)
809 {
810 assert(scalar->num_components == 1);
811 assert(num_components <= NIR_MAX_VEC_COMPONENTS);
812
813 nir_def *copies[NIR_MAX_VEC_COMPONENTS] = { NULL };
814 for (unsigned i = 0; i < num_components; ++i)
815 copies[i] = scalar;
816
817 return nir_vec(b, copies, num_components);
818 }
819
820 static inline nir_def *
nir_iadd_imm(nir_builder * build,nir_def * x,uint64_t y)821 nir_iadd_imm(nir_builder *build, nir_def *x, uint64_t y)
822 {
823 assert(x->bit_size <= 64);
824 y &= BITFIELD64_MASK(x->bit_size);
825
826 if (y == 0) {
827 return x;
828 } else {
829 return nir_iadd(build, x, nir_imm_intN_t(build, y, x->bit_size));
830 }
831 }
832
833 static inline nir_def *
nir_iadd_imm_nuw(nir_builder * b,nir_def * x,uint64_t y)834 nir_iadd_imm_nuw(nir_builder *b, nir_def *x, uint64_t y)
835 {
836 nir_def *d = nir_iadd_imm(b, x, y);
837 if (d != x && d->parent_instr->type == nir_instr_type_alu)
838 nir_instr_as_alu(d->parent_instr)->no_unsigned_wrap = true;
839 return d;
840 }
841
842 static inline nir_def *
nir_iadd_nuw(nir_builder * b,nir_def * x,nir_def * y)843 nir_iadd_nuw(nir_builder *b, nir_def *x, nir_def *y)
844 {
845 nir_def *d = nir_iadd(b, x, y);
846 nir_instr_as_alu(d->parent_instr)->no_unsigned_wrap = true;
847 return d;
848 }
849
850 static inline nir_def *
nir_fgt_imm(nir_builder * build,nir_def * src1,double src2)851 nir_fgt_imm(nir_builder *build, nir_def *src1, double src2)
852 {
853 return nir_flt(build, nir_imm_floatN_t(build, src2, src1->bit_size), src1);
854 }
855
856 static inline nir_def *
nir_fle_imm(nir_builder * build,nir_def * src1,double src2)857 nir_fle_imm(nir_builder *build, nir_def *src1, double src2)
858 {
859 return nir_fge(build, nir_imm_floatN_t(build, src2, src1->bit_size), src1);
860 }
861
862 /* Use nir_iadd(x, -y) for reversing parameter ordering */
863 static inline nir_def *
nir_isub_imm(nir_builder * build,uint64_t y,nir_def * x)864 nir_isub_imm(nir_builder *build, uint64_t y, nir_def *x)
865 {
866 return nir_isub(build, nir_imm_intN_t(build, y, x->bit_size), x);
867 }
868
869 static inline nir_def *
_nir_mul_imm(nir_builder * build,nir_def * x,uint64_t y,bool amul)870 _nir_mul_imm(nir_builder *build, nir_def *x, uint64_t y, bool amul)
871 {
872 assert(x->bit_size <= 64);
873 y &= BITFIELD64_MASK(x->bit_size);
874
875 if (y == 0) {
876 return nir_imm_intN_t(build, 0, x->bit_size);
877 } else if (y == 1) {
878 return x;
879 } else if ((!build->shader->options ||
880 !build->shader->options->lower_bitops) &&
881 util_is_power_of_two_or_zero64(y)) {
882 return nir_ishl(build, x, nir_imm_int(build, ffsll(y) - 1));
883 } else if (amul) {
884 return nir_amul(build, x, nir_imm_intN_t(build, y, x->bit_size));
885 } else {
886 return nir_imul(build, x, nir_imm_intN_t(build, y, x->bit_size));
887 }
888 }
889
890 static inline nir_def *
nir_imul_imm(nir_builder * build,nir_def * x,uint64_t y)891 nir_imul_imm(nir_builder *build, nir_def *x, uint64_t y)
892 {
893 return _nir_mul_imm(build, x, y, false);
894 }
895
896 static inline nir_def *
nir_amul_imm(nir_builder * build,nir_def * x,uint64_t y)897 nir_amul_imm(nir_builder *build, nir_def *x, uint64_t y)
898 {
899 return _nir_mul_imm(build, x, y, true);
900 }
901
902 static inline nir_def *
nir_fadd_imm(nir_builder * build,nir_def * x,double y)903 nir_fadd_imm(nir_builder *build, nir_def *x, double y)
904 {
905 return nir_fadd(build, x, nir_imm_floatN_t(build, y, x->bit_size));
906 }
907
908 static inline nir_def *
nir_fsub_imm(nir_builder * build,double x,nir_def * y)909 nir_fsub_imm(nir_builder *build, double x, nir_def *y)
910 {
911 return nir_fsub(build, nir_imm_floatN_t(build, x, y->bit_size), y);
912 }
913
914 static inline nir_def *
nir_fmul_imm(nir_builder * build,nir_def * x,double y)915 nir_fmul_imm(nir_builder *build, nir_def *x, double y)
916 {
917 return nir_fmul(build, x, nir_imm_floatN_t(build, y, x->bit_size));
918 }
919
920 static inline nir_def *
nir_fdiv_imm(nir_builder * build,nir_def * x,double y)921 nir_fdiv_imm(nir_builder *build, nir_def *x, double y)
922 {
923 return nir_fdiv(build, x, nir_imm_floatN_t(build, y, x->bit_size));
924 }
925
926 static inline nir_def *
nir_iand_imm(nir_builder * build,nir_def * x,uint64_t y)927 nir_iand_imm(nir_builder *build, nir_def *x, uint64_t y)
928 {
929 assert(x->bit_size <= 64);
930 y &= BITFIELD64_MASK(x->bit_size);
931
932 if (y == 0) {
933 return nir_imm_intN_t(build, 0, x->bit_size);
934 } else if (y == BITFIELD64_MASK(x->bit_size)) {
935 return x;
936 } else {
937 return nir_iand(build, x, nir_imm_intN_t(build, y, x->bit_size));
938 }
939 }
940
941 static inline nir_def *
nir_test_mask(nir_builder * build,nir_def * x,uint64_t mask)942 nir_test_mask(nir_builder *build, nir_def *x, uint64_t mask)
943 {
944 assert(mask <= BITFIELD64_MASK(x->bit_size));
945 return nir_ine_imm(build, nir_iand_imm(build, x, mask), 0);
946 }
947
948 static inline nir_def *
nir_ior_imm(nir_builder * build,nir_def * x,uint64_t y)949 nir_ior_imm(nir_builder *build, nir_def *x, uint64_t y)
950 {
951 assert(x->bit_size <= 64);
952 y &= BITFIELD64_MASK(x->bit_size);
953
954 if (y == 0) {
955 return x;
956 } else if (y == BITFIELD64_MASK(x->bit_size)) {
957 return nir_imm_intN_t(build, y, x->bit_size);
958 } else
959 return nir_ior(build, x, nir_imm_intN_t(build, y, x->bit_size));
960 }
961
962 static inline nir_def *
nir_ishl_imm(nir_builder * build,nir_def * x,uint32_t y)963 nir_ishl_imm(nir_builder *build, nir_def *x, uint32_t y)
964 {
965 if (y == 0) {
966 return x;
967 } else {
968 assert(y < x->bit_size);
969 return nir_ishl(build, x, nir_imm_int(build, y));
970 }
971 }
972
973 static inline nir_def *
nir_ishr_imm(nir_builder * build,nir_def * x,uint32_t y)974 nir_ishr_imm(nir_builder *build, nir_def *x, uint32_t y)
975 {
976 if (y == 0) {
977 return x;
978 } else {
979 return nir_ishr(build, x, nir_imm_int(build, y));
980 }
981 }
982
983 static inline nir_def *
nir_ushr_imm(nir_builder * build,nir_def * x,uint32_t y)984 nir_ushr_imm(nir_builder *build, nir_def *x, uint32_t y)
985 {
986 if (y == 0) {
987 return x;
988 } else {
989 return nir_ushr(build, x, nir_imm_int(build, y));
990 }
991 }
992
993 static inline nir_def *
nir_imod_imm(nir_builder * build,nir_def * x,uint64_t y)994 nir_imod_imm(nir_builder *build, nir_def *x, uint64_t y)
995 {
996 return nir_imod(build, x, nir_imm_intN_t(build, y, x->bit_size));
997 }
998
999 static inline nir_def *
nir_udiv_imm(nir_builder * build,nir_def * x,uint64_t y)1000 nir_udiv_imm(nir_builder *build, nir_def *x, uint64_t y)
1001 {
1002 assert(x->bit_size <= 64);
1003 y &= BITFIELD64_MASK(x->bit_size);
1004
1005 if (y == 1) {
1006 return x;
1007 } else if (util_is_power_of_two_nonzero64(y)) {
1008 return nir_ushr_imm(build, x, ffsll(y) - 1);
1009 } else {
1010 return nir_udiv(build, x, nir_imm_intN_t(build, y, x->bit_size));
1011 }
1012 }
1013
1014 static inline nir_def *
nir_umod_imm(nir_builder * build,nir_def * x,uint64_t y)1015 nir_umod_imm(nir_builder *build, nir_def *x, uint64_t y)
1016 {
1017 assert(y > 0 && y <= u_uintN_max(x->bit_size));
1018
1019 if (util_is_power_of_two_nonzero64(y)) {
1020 return nir_iand_imm(build, x, y - 1);
1021 } else {
1022 return nir_umod(build, x, nir_imm_intN_t(build, y, x->bit_size));
1023 }
1024 }
1025
1026 static inline nir_def *
nir_ibfe_imm(nir_builder * build,nir_def * x,uint32_t offset,uint32_t size)1027 nir_ibfe_imm(nir_builder *build, nir_def *x, uint32_t offset, uint32_t size)
1028 {
1029 return nir_ibfe(build, x, nir_imm_int(build, offset), nir_imm_int(build, size));
1030 }
1031
1032 static inline nir_def *
nir_ubfe_imm(nir_builder * build,nir_def * x,uint32_t offset,uint32_t size)1033 nir_ubfe_imm(nir_builder *build, nir_def *x, uint32_t offset, uint32_t size)
1034 {
1035 return nir_ubfe(build, x, nir_imm_int(build, offset), nir_imm_int(build, size));
1036 }
1037
1038 static inline nir_def *
nir_ubitfield_extract_imm(nir_builder * build,nir_def * x,uint32_t offset,uint32_t size)1039 nir_ubitfield_extract_imm(nir_builder *build, nir_def *x, uint32_t offset, uint32_t size)
1040 {
1041 return nir_ubitfield_extract(build, x, nir_imm_int(build, offset), nir_imm_int(build, size));
1042 }
1043
1044 static inline nir_def *
nir_extract_u8_imm(nir_builder * b,nir_def * a,unsigned i)1045 nir_extract_u8_imm(nir_builder *b, nir_def *a, unsigned i)
1046 {
1047 return nir_extract_u8(b, a, nir_imm_intN_t(b, i, a->bit_size));
1048 }
1049
1050 static inline nir_def *
nir_extract_i8_imm(nir_builder * b,nir_def * a,unsigned i)1051 nir_extract_i8_imm(nir_builder *b, nir_def *a, unsigned i)
1052 {
1053 return nir_extract_i8(b, a, nir_imm_intN_t(b, i, a->bit_size));
1054 }
1055
1056 static inline nir_def *
nir_fclamp(nir_builder * b,nir_def * x,nir_def * min_val,nir_def * max_val)1057 nir_fclamp(nir_builder *b,
1058 nir_def *x, nir_def *min_val, nir_def *max_val)
1059 {
1060 return nir_fmin(b, nir_fmax(b, x, min_val), max_val);
1061 }
1062
1063 static inline nir_def *
nir_iclamp(nir_builder * b,nir_def * x,nir_def * min_val,nir_def * max_val)1064 nir_iclamp(nir_builder *b,
1065 nir_def *x, nir_def *min_val, nir_def *max_val)
1066 {
1067 return nir_imin(b, nir_imax(b, x, min_val), max_val);
1068 }
1069
1070 static inline nir_def *
nir_uclamp(nir_builder * b,nir_def * x,nir_def * min_val,nir_def * max_val)1071 nir_uclamp(nir_builder *b,
1072 nir_def *x, nir_def *min_val, nir_def *max_val)
1073 {
1074 return nir_umin(b, nir_umax(b, x, min_val), max_val);
1075 }
1076
1077 static inline nir_def *
nir_ffma_imm12(nir_builder * build,nir_def * src0,double src1,double src2)1078 nir_ffma_imm12(nir_builder *build, nir_def *src0, double src1, double src2)
1079 {
1080 if (build->shader->options &&
1081 build->shader->options->avoid_ternary_with_two_constants)
1082 return nir_fadd_imm(build, nir_fmul_imm(build, src0, src1), src2);
1083 else
1084 return nir_ffma(build, src0, nir_imm_floatN_t(build, src1, src0->bit_size),
1085 nir_imm_floatN_t(build, src2, src0->bit_size));
1086 }
1087
1088 static inline nir_def *
nir_ffma_imm1(nir_builder * build,nir_def * src0,double src1,nir_def * src2)1089 nir_ffma_imm1(nir_builder *build, nir_def *src0, double src1, nir_def *src2)
1090 {
1091 return nir_ffma(build, src0, nir_imm_floatN_t(build, src1, src0->bit_size), src2);
1092 }
1093
1094 static inline nir_def *
nir_ffma_imm2(nir_builder * build,nir_def * src0,nir_def * src1,double src2)1095 nir_ffma_imm2(nir_builder *build, nir_def *src0, nir_def *src1, double src2)
1096 {
1097 return nir_ffma(build, src0, src1, nir_imm_floatN_t(build, src2, src0->bit_size));
1098 }
1099
1100 static inline nir_def *
nir_a_minus_bc(nir_builder * build,nir_def * src0,nir_def * src1,nir_def * src2)1101 nir_a_minus_bc(nir_builder *build, nir_def *src0, nir_def *src1,
1102 nir_def *src2)
1103 {
1104 return nir_ffma(build, nir_fneg(build, src1), src2, src0);
1105 }
1106
1107 static inline nir_def *
nir_pack_bits(nir_builder * b,nir_def * src,unsigned dest_bit_size)1108 nir_pack_bits(nir_builder *b, nir_def *src, unsigned dest_bit_size)
1109 {
1110 assert(src->num_components * src->bit_size == dest_bit_size);
1111
1112 switch (dest_bit_size) {
1113 case 64:
1114 switch (src->bit_size) {
1115 case 32:
1116 return nir_pack_64_2x32(b, src);
1117 case 16:
1118 return nir_pack_64_4x16(b, src);
1119 default:
1120 break;
1121 }
1122 break;
1123
1124 case 32:
1125 switch (src->bit_size) {
1126 case 32: return src;
1127 case 16: return nir_pack_32_2x16(b, src);
1128 case 8: return nir_pack_32_4x8(b, src);
1129 default: break;
1130 }
1131
1132 break;
1133
1134 default:
1135 break;
1136 }
1137
1138 /* If we got here, we have no dedicated unpack opcode. */
1139 nir_def *dest = nir_imm_intN_t(b, 0, dest_bit_size);
1140 for (unsigned i = 0; i < src->num_components; i++) {
1141 nir_def *val = nir_u2uN(b, nir_channel(b, src, i), dest_bit_size);
1142 val = nir_ishl(b, val, nir_imm_int(b, i * src->bit_size));
1143 dest = nir_ior(b, dest, val);
1144 }
1145 return dest;
1146 }
1147
1148 static inline nir_def *
nir_unpack_bits(nir_builder * b,nir_def * src,unsigned dest_bit_size)1149 nir_unpack_bits(nir_builder *b, nir_def *src, unsigned dest_bit_size)
1150 {
1151 assert(src->num_components == 1);
1152 assert(src->bit_size >= dest_bit_size);
1153 const unsigned dest_num_components = src->bit_size / dest_bit_size;
1154 assert(dest_num_components <= NIR_MAX_VEC_COMPONENTS);
1155
1156 switch (src->bit_size) {
1157 case 64:
1158 switch (dest_bit_size) {
1159 case 32:
1160 return nir_unpack_64_2x32(b, src);
1161 case 16:
1162 return nir_unpack_64_4x16(b, src);
1163 default:
1164 break;
1165 }
1166 break;
1167
1168 case 32:
1169 switch (dest_bit_size) {
1170 case 32: return src;
1171 case 16: return nir_unpack_32_2x16(b, src);
1172 case 8: return nir_unpack_32_4x8(b, src);
1173 default: break;
1174 }
1175
1176 break;
1177
1178 default:
1179 break;
1180 }
1181
1182 /* If we got here, we have no dedicated unpack opcode. */
1183 nir_def *dest_comps[NIR_MAX_VEC_COMPONENTS];
1184 for (unsigned i = 0; i < dest_num_components; i++) {
1185 nir_def *val = nir_ushr_imm(b, src, i * dest_bit_size);
1186 dest_comps[i] = nir_u2uN(b, val, dest_bit_size);
1187 }
1188 return nir_vec(b, dest_comps, dest_num_components);
1189 }
1190
1191 /**
1192 * Treats srcs as if it's one big blob of bits and extracts the range of bits
1193 * given by
1194 *
1195 * [first_bit, first_bit + dest_num_components * dest_bit_size)
1196 *
1197 * The range can have any alignment or size as long as it's an integer number
1198 * of destination components and fits inside the concatenated sources.
1199 *
1200 * TODO: The one caveat here is that we can't handle byte alignment if 64-bit
1201 * values are involved because that would require pack/unpack to/from a vec8
1202 * which NIR currently does not support.
1203 */
1204 static inline nir_def *
nir_extract_bits(nir_builder * b,nir_def ** srcs,unsigned num_srcs,unsigned first_bit,unsigned dest_num_components,unsigned dest_bit_size)1205 nir_extract_bits(nir_builder *b, nir_def **srcs, unsigned num_srcs,
1206 unsigned first_bit,
1207 unsigned dest_num_components, unsigned dest_bit_size)
1208 {
1209 const unsigned num_bits = dest_num_components * dest_bit_size;
1210
1211 /* Figure out the common bit size */
1212 unsigned common_bit_size = dest_bit_size;
1213 for (unsigned i = 0; i < num_srcs; i++)
1214 common_bit_size = MIN2(common_bit_size, srcs[i]->bit_size);
1215 if (first_bit > 0)
1216 common_bit_size = MIN2(common_bit_size, (1u << (ffs(first_bit) - 1)));
1217
1218 /* We don't want to have to deal with 1-bit values */
1219 assert(common_bit_size >= 8);
1220
1221 nir_def *common_comps[NIR_MAX_VEC_COMPONENTS * sizeof(uint64_t)];
1222 assert(num_bits / common_bit_size <= ARRAY_SIZE(common_comps));
1223
1224 /* First, unpack to the common bit size and select the components from the
1225 * source.
1226 */
1227 int src_idx = -1;
1228 unsigned src_start_bit = 0;
1229 unsigned src_end_bit = 0;
1230 for (unsigned i = 0; i < num_bits / common_bit_size; i++) {
1231 const unsigned bit = first_bit + (i * common_bit_size);
1232 while (bit >= src_end_bit) {
1233 src_idx++;
1234 assert(src_idx < (int)num_srcs);
1235 src_start_bit = src_end_bit;
1236 src_end_bit += srcs[src_idx]->bit_size *
1237 srcs[src_idx]->num_components;
1238 }
1239 assert(bit >= src_start_bit);
1240 assert(bit + common_bit_size <= src_end_bit);
1241 const unsigned rel_bit = bit - src_start_bit;
1242 const unsigned src_bit_size = srcs[src_idx]->bit_size;
1243
1244 nir_def *comp = nir_channel(b, srcs[src_idx],
1245 rel_bit / src_bit_size);
1246 if (srcs[src_idx]->bit_size > common_bit_size) {
1247 nir_def *unpacked = nir_unpack_bits(b, comp, common_bit_size);
1248 comp = nir_channel(b, unpacked, (rel_bit % src_bit_size) / common_bit_size);
1249 }
1250 common_comps[i] = comp;
1251 }
1252
1253 /* Now, re-pack the destination if we have to */
1254 if (dest_bit_size > common_bit_size) {
1255 unsigned common_per_dest = dest_bit_size / common_bit_size;
1256 nir_def *dest_comps[NIR_MAX_VEC_COMPONENTS];
1257 for (unsigned i = 0; i < dest_num_components; i++) {
1258 nir_def *unpacked = nir_vec(b, common_comps + i * common_per_dest,
1259 common_per_dest);
1260 dest_comps[i] = nir_pack_bits(b, unpacked, dest_bit_size);
1261 }
1262 return nir_vec(b, dest_comps, dest_num_components);
1263 } else {
1264 assert(dest_bit_size == common_bit_size);
1265 return nir_vec(b, common_comps, dest_num_components);
1266 }
1267 }
1268
1269 static inline nir_def *
nir_bitcast_vector(nir_builder * b,nir_def * src,unsigned dest_bit_size)1270 nir_bitcast_vector(nir_builder *b, nir_def *src, unsigned dest_bit_size)
1271 {
1272 assert((src->bit_size * src->num_components) % dest_bit_size == 0);
1273 const unsigned dest_num_components =
1274 (src->bit_size * src->num_components) / dest_bit_size;
1275 assert(dest_num_components <= NIR_MAX_VEC_COMPONENTS);
1276
1277 return nir_extract_bits(b, &src, 1, 0, dest_num_components, dest_bit_size);
1278 }
1279
1280 static inline nir_def *
nir_trim_vector(nir_builder * b,nir_def * src,unsigned num_components)1281 nir_trim_vector(nir_builder *b, nir_def *src, unsigned num_components)
1282 {
1283 assert(src->num_components >= num_components);
1284 if (src->num_components == num_components)
1285 return src;
1286
1287 return nir_channels(b, src, nir_component_mask(num_components));
1288 }
1289
1290 /**
1291 * Pad a value to N components with undefs of matching bit size.
1292 * If the value already contains >= num_components, it is returned without change.
1293 */
1294 static inline nir_def *
nir_pad_vector(nir_builder * b,nir_def * src,unsigned num_components)1295 nir_pad_vector(nir_builder *b, nir_def *src, unsigned num_components)
1296 {
1297 assert(src->num_components <= num_components);
1298 if (src->num_components == num_components)
1299 return src;
1300
1301 nir_scalar components[NIR_MAX_VEC_COMPONENTS];
1302 nir_scalar undef = nir_get_scalar(nir_undef(b, 1, src->bit_size), 0);
1303 unsigned i = 0;
1304 for (; i < src->num_components; i++)
1305 components[i] = nir_get_scalar(src, i);
1306 for (; i < num_components; i++)
1307 components[i] = undef;
1308
1309 return nir_vec_scalars(b, components, num_components);
1310 }
1311
1312 /**
1313 * Pad a value to N components with copies of the given immediate of matching
1314 * bit size. If the value already contains >= num_components, it is returned
1315 * without change.
1316 */
1317 static inline nir_def *
nir_pad_vector_imm_int(nir_builder * b,nir_def * src,uint64_t imm_val,unsigned num_components)1318 nir_pad_vector_imm_int(nir_builder *b, nir_def *src, uint64_t imm_val,
1319 unsigned num_components)
1320 {
1321 assert(src->num_components <= num_components);
1322 if (src->num_components == num_components)
1323 return src;
1324
1325 nir_scalar components[NIR_MAX_VEC_COMPONENTS];
1326 nir_scalar imm = nir_get_scalar(nir_imm_intN_t(b, imm_val, src->bit_size), 0);
1327 unsigned i = 0;
1328 for (; i < src->num_components; i++)
1329 components[i] = nir_get_scalar(src, i);
1330 for (; i < num_components; i++)
1331 components[i] = imm;
1332
1333 return nir_vec_scalars(b, components, num_components);
1334 }
1335
1336 /**
1337 * Pad a value to 4 components with undefs of matching bit size.
1338 * If the value already contains >= 4 components, it is returned without change.
1339 */
1340 static inline nir_def *
nir_pad_vec4(nir_builder * b,nir_def * src)1341 nir_pad_vec4(nir_builder *b, nir_def *src)
1342 {
1343 return nir_pad_vector(b, src, 4);
1344 }
1345
1346 /**
1347 * Resizes a vector by either trimming off components or adding undef
1348 * components, as needed. Only use this helper if it's actually what you
1349 * need. Prefer nir_pad_vector() or nir_trim_vector() instead if you know a
1350 * priori which direction you're resizing.
1351 */
1352 static inline nir_def *
nir_resize_vector(nir_builder * b,nir_def * src,unsigned num_components)1353 nir_resize_vector(nir_builder *b, nir_def *src, unsigned num_components)
1354 {
1355 if (src->num_components < num_components)
1356 return nir_pad_vector(b, src, num_components);
1357 else
1358 return nir_trim_vector(b, src, num_components);
1359 }
1360
1361 nir_def *
1362 nir_ssa_for_alu_src(nir_builder *build, nir_alu_instr *instr, unsigned srcn);
1363
1364 static inline unsigned
nir_get_ptr_bitsize(nir_shader * shader)1365 nir_get_ptr_bitsize(nir_shader *shader)
1366 {
1367 if (shader->info.stage == MESA_SHADER_KERNEL)
1368 return shader->info.cs.ptr_size;
1369 return 32;
1370 }
1371
1372 static inline nir_deref_instr *
nir_build_deref_var(nir_builder * build,nir_variable * var)1373 nir_build_deref_var(nir_builder *build, nir_variable *var)
1374 {
1375 nir_deref_instr *deref =
1376 nir_deref_instr_create(build->shader, nir_deref_type_var);
1377
1378 deref->modes = (nir_variable_mode)var->data.mode;
1379 deref->type = var->type;
1380 deref->var = var;
1381
1382 nir_def_init(&deref->instr, &deref->def, 1,
1383 nir_get_ptr_bitsize(build->shader));
1384
1385 nir_builder_instr_insert(build, &deref->instr);
1386
1387 return deref;
1388 }
1389
1390 static inline nir_deref_instr *
nir_build_deref_array(nir_builder * build,nir_deref_instr * parent,nir_def * index)1391 nir_build_deref_array(nir_builder *build, nir_deref_instr *parent,
1392 nir_def *index)
1393 {
1394 assert(glsl_type_is_array(parent->type) ||
1395 glsl_type_is_matrix(parent->type) ||
1396 glsl_type_is_vector(parent->type));
1397
1398 assert(index->bit_size == parent->def.bit_size);
1399
1400 nir_deref_instr *deref =
1401 nir_deref_instr_create(build->shader, nir_deref_type_array);
1402
1403 deref->modes = parent->modes;
1404 deref->type = glsl_get_array_element(parent->type);
1405 deref->parent = nir_src_for_ssa(&parent->def);
1406 deref->arr.index = nir_src_for_ssa(index);
1407
1408 nir_def_init(&deref->instr, &deref->def,
1409 parent->def.num_components, parent->def.bit_size);
1410
1411 nir_builder_instr_insert(build, &deref->instr);
1412
1413 return deref;
1414 }
1415
1416 static inline nir_deref_instr *
nir_build_deref_array_imm(nir_builder * build,nir_deref_instr * parent,int64_t index)1417 nir_build_deref_array_imm(nir_builder *build, nir_deref_instr *parent,
1418 int64_t index)
1419 {
1420 nir_def *idx_ssa = nir_imm_intN_t(build, index,
1421 parent->def.bit_size);
1422
1423 return nir_build_deref_array(build, parent, idx_ssa);
1424 }
1425
1426 static inline nir_deref_instr *
nir_build_deref_ptr_as_array(nir_builder * build,nir_deref_instr * parent,nir_def * index)1427 nir_build_deref_ptr_as_array(nir_builder *build, nir_deref_instr *parent,
1428 nir_def *index)
1429 {
1430 assert(parent->deref_type == nir_deref_type_array ||
1431 parent->deref_type == nir_deref_type_ptr_as_array ||
1432 parent->deref_type == nir_deref_type_cast);
1433
1434 assert(index->bit_size == parent->def.bit_size);
1435
1436 nir_deref_instr *deref =
1437 nir_deref_instr_create(build->shader, nir_deref_type_ptr_as_array);
1438
1439 deref->modes = parent->modes;
1440 deref->type = parent->type;
1441 deref->parent = nir_src_for_ssa(&parent->def);
1442 deref->arr.index = nir_src_for_ssa(index);
1443
1444 nir_def_init(&deref->instr, &deref->def,
1445 parent->def.num_components, parent->def.bit_size);
1446
1447 nir_builder_instr_insert(build, &deref->instr);
1448
1449 return deref;
1450 }
1451
1452 static inline nir_deref_instr *
nir_build_deref_array_wildcard(nir_builder * build,nir_deref_instr * parent)1453 nir_build_deref_array_wildcard(nir_builder *build, nir_deref_instr *parent)
1454 {
1455 assert(glsl_type_is_array(parent->type) ||
1456 glsl_type_is_matrix(parent->type));
1457
1458 nir_deref_instr *deref =
1459 nir_deref_instr_create(build->shader, nir_deref_type_array_wildcard);
1460
1461 deref->modes = parent->modes;
1462 deref->type = glsl_get_array_element(parent->type);
1463 deref->parent = nir_src_for_ssa(&parent->def);
1464
1465 nir_def_init(&deref->instr, &deref->def,
1466 parent->def.num_components, parent->def.bit_size);
1467
1468 nir_builder_instr_insert(build, &deref->instr);
1469
1470 return deref;
1471 }
1472
1473 static inline nir_deref_instr *
nir_build_deref_struct(nir_builder * build,nir_deref_instr * parent,unsigned index)1474 nir_build_deref_struct(nir_builder *build, nir_deref_instr *parent,
1475 unsigned index)
1476 {
1477 assert(glsl_type_is_struct_or_ifc(parent->type));
1478
1479 nir_deref_instr *deref =
1480 nir_deref_instr_create(build->shader, nir_deref_type_struct);
1481
1482 deref->modes = parent->modes;
1483 deref->type = glsl_get_struct_field(parent->type, index);
1484 deref->parent = nir_src_for_ssa(&parent->def);
1485 deref->strct.index = index;
1486
1487 nir_def_init(&deref->instr, &deref->def,
1488 parent->def.num_components, parent->def.bit_size);
1489
1490 nir_builder_instr_insert(build, &deref->instr);
1491
1492 return deref;
1493 }
1494
1495 static inline nir_deref_instr *
nir_build_deref_cast_with_alignment(nir_builder * build,nir_def * parent,nir_variable_mode modes,const struct glsl_type * type,unsigned ptr_stride,unsigned align_mul,unsigned align_offset)1496 nir_build_deref_cast_with_alignment(nir_builder *build, nir_def *parent,
1497 nir_variable_mode modes,
1498 const struct glsl_type *type,
1499 unsigned ptr_stride,
1500 unsigned align_mul,
1501 unsigned align_offset)
1502 {
1503 nir_deref_instr *deref =
1504 nir_deref_instr_create(build->shader, nir_deref_type_cast);
1505
1506 deref->modes = modes;
1507 deref->type = type;
1508 deref->parent = nir_src_for_ssa(parent);
1509 deref->cast.align_mul = align_mul;
1510 deref->cast.align_offset = align_offset;
1511 deref->cast.ptr_stride = ptr_stride;
1512
1513 nir_def_init(&deref->instr, &deref->def, parent->num_components,
1514 parent->bit_size);
1515
1516 nir_builder_instr_insert(build, &deref->instr);
1517
1518 return deref;
1519 }
1520
1521 static inline nir_deref_instr *
nir_build_deref_cast(nir_builder * build,nir_def * parent,nir_variable_mode modes,const struct glsl_type * type,unsigned ptr_stride)1522 nir_build_deref_cast(nir_builder *build, nir_def *parent,
1523 nir_variable_mode modes, const struct glsl_type *type,
1524 unsigned ptr_stride)
1525 {
1526 return nir_build_deref_cast_with_alignment(build, parent, modes, type,
1527 ptr_stride, 0, 0);
1528 }
1529
1530 static inline nir_deref_instr *
nir_alignment_deref_cast(nir_builder * build,nir_deref_instr * parent,uint32_t align_mul,uint32_t align_offset)1531 nir_alignment_deref_cast(nir_builder *build, nir_deref_instr *parent,
1532 uint32_t align_mul, uint32_t align_offset)
1533 {
1534 nir_deref_instr *deref =
1535 nir_deref_instr_create(build->shader, nir_deref_type_cast);
1536
1537 deref->modes = parent->modes;
1538 deref->type = parent->type;
1539 deref->parent = nir_src_for_ssa(&parent->def);
1540 deref->cast.ptr_stride = nir_deref_instr_array_stride(deref);
1541 deref->cast.align_mul = align_mul;
1542 deref->cast.align_offset = align_offset;
1543
1544 nir_def_init(&deref->instr, &deref->def,
1545 parent->def.num_components, parent->def.bit_size);
1546
1547 nir_builder_instr_insert(build, &deref->instr);
1548
1549 return deref;
1550 }
1551
1552 /** Returns a deref that follows another but starting from the given parent
1553 *
1554 * The new deref will be the same type and take the same array or struct index
1555 * as the leader deref but it may have a different parent. This is very
1556 * useful for walking deref paths.
1557 */
1558 static inline nir_deref_instr *
nir_build_deref_follower(nir_builder * b,nir_deref_instr * parent,nir_deref_instr * leader)1559 nir_build_deref_follower(nir_builder *b, nir_deref_instr *parent,
1560 nir_deref_instr *leader)
1561 {
1562 /* If the derefs would have the same parent, don't make a new one */
1563 if (leader->parent.ssa == &parent->def)
1564 return leader;
1565
1566 UNUSED nir_deref_instr *leader_parent = nir_src_as_deref(leader->parent);
1567
1568 switch (leader->deref_type) {
1569 case nir_deref_type_var:
1570 unreachable("A var dereference cannot have a parent");
1571 break;
1572
1573 case nir_deref_type_array:
1574 case nir_deref_type_array_wildcard:
1575 assert(glsl_type_is_matrix(parent->type) ||
1576 glsl_type_is_array(parent->type) ||
1577 (leader->deref_type == nir_deref_type_array &&
1578 glsl_type_is_vector(parent->type)));
1579 assert(glsl_get_length(parent->type) ==
1580 glsl_get_length(leader_parent->type));
1581
1582 if (leader->deref_type == nir_deref_type_array) {
1583 nir_def *index = nir_i2iN(b, leader->arr.index.ssa,
1584 parent->def.bit_size);
1585 return nir_build_deref_array(b, parent, index);
1586 } else {
1587 return nir_build_deref_array_wildcard(b, parent);
1588 }
1589
1590 case nir_deref_type_struct:
1591 assert(glsl_type_is_struct_or_ifc(parent->type));
1592 assert(glsl_get_length(parent->type) ==
1593 glsl_get_length(leader_parent->type));
1594
1595 return nir_build_deref_struct(b, parent, leader->strct.index);
1596
1597 case nir_deref_type_cast:
1598 return nir_build_deref_cast_with_alignment(b, &parent->def,
1599 leader->modes,
1600 leader->type,
1601 leader->cast.ptr_stride,
1602 leader->cast.align_mul,
1603 leader->cast.align_offset);
1604 default:
1605 unreachable("Invalid deref instruction type");
1606 }
1607 return NULL;
1608 }
1609
1610 static inline nir_def *
nir_load_deref_with_access(nir_builder * build,nir_deref_instr * deref,enum gl_access_qualifier access)1611 nir_load_deref_with_access(nir_builder *build, nir_deref_instr *deref,
1612 enum gl_access_qualifier access)
1613 {
1614 return nir_build_load_deref(build, glsl_get_vector_elements(deref->type),
1615 glsl_get_bit_size(deref->type), &deref->def,
1616 access);
1617 }
1618
1619 #undef nir_load_deref
1620 static inline nir_def *
nir_load_deref(nir_builder * build,nir_deref_instr * deref)1621 nir_load_deref(nir_builder *build, nir_deref_instr *deref)
1622 {
1623 return nir_load_deref_with_access(build, deref, (enum gl_access_qualifier)0);
1624 }
1625
1626 static inline void
nir_store_deref_with_access(nir_builder * build,nir_deref_instr * deref,nir_def * value,unsigned writemask,enum gl_access_qualifier access)1627 nir_store_deref_with_access(nir_builder *build, nir_deref_instr *deref,
1628 nir_def *value, unsigned writemask,
1629 enum gl_access_qualifier access)
1630 {
1631 writemask &= (1u << value->num_components) - 1u;
1632 nir_build_store_deref(build, &deref->def, value, writemask, access);
1633 }
1634
1635 #undef nir_store_deref
1636 static inline void
nir_store_deref(nir_builder * build,nir_deref_instr * deref,nir_def * value,unsigned writemask)1637 nir_store_deref(nir_builder *build, nir_deref_instr *deref,
1638 nir_def *value, unsigned writemask)
1639 {
1640 nir_store_deref_with_access(build, deref, value, writemask,
1641 (enum gl_access_qualifier)0);
1642 }
1643
1644 static inline void
nir_build_write_masked_store(nir_builder * b,nir_deref_instr * vec_deref,nir_def * value,unsigned component)1645 nir_build_write_masked_store(nir_builder *b, nir_deref_instr *vec_deref,
1646 nir_def *value, unsigned component)
1647 {
1648 assert(value->num_components == 1);
1649 unsigned num_components = glsl_get_components(vec_deref->type);
1650 assert(num_components > 1 && num_components <= NIR_MAX_VEC_COMPONENTS);
1651
1652 nir_def *vec =
1653 nir_vector_insert_imm(b, nir_undef(b, num_components, value->bit_size),
1654 value, component);
1655 nir_store_deref(b, vec_deref, vec, (1u << component));
1656 }
1657
1658 static inline void
nir_build_write_masked_stores(nir_builder * b,nir_deref_instr * vec_deref,nir_def * value,nir_def * index,unsigned start,unsigned end)1659 nir_build_write_masked_stores(nir_builder *b, nir_deref_instr *vec_deref,
1660 nir_def *value, nir_def *index,
1661 unsigned start, unsigned end)
1662 {
1663 if (start == end - 1) {
1664 nir_build_write_masked_store(b, vec_deref, value, start);
1665 } else {
1666 unsigned mid = start + (end - start) / 2;
1667 nir_push_if(b, nir_ilt_imm(b, index, mid));
1668 nir_build_write_masked_stores(b, vec_deref, value, index, start, mid);
1669 nir_push_else(b, NULL);
1670 nir_build_write_masked_stores(b, vec_deref, value, index, mid, end);
1671 nir_pop_if(b, NULL);
1672 }
1673 }
1674
1675 static inline void
nir_copy_deref_with_access(nir_builder * build,nir_deref_instr * dest,nir_deref_instr * src,enum gl_access_qualifier dest_access,enum gl_access_qualifier src_access)1676 nir_copy_deref_with_access(nir_builder *build, nir_deref_instr *dest,
1677 nir_deref_instr *src,
1678 enum gl_access_qualifier dest_access,
1679 enum gl_access_qualifier src_access)
1680 {
1681 nir_build_copy_deref(build, &dest->def, &src->def, dest_access, src_access);
1682 }
1683
1684 #undef nir_copy_deref
1685 static inline void
nir_copy_deref(nir_builder * build,nir_deref_instr * dest,nir_deref_instr * src)1686 nir_copy_deref(nir_builder *build, nir_deref_instr *dest, nir_deref_instr *src)
1687 {
1688 nir_copy_deref_with_access(build, dest, src,
1689 (enum gl_access_qualifier)0,
1690 (enum gl_access_qualifier)0);
1691 }
1692
1693 static inline void
nir_memcpy_deref_with_access(nir_builder * build,nir_deref_instr * dest,nir_deref_instr * src,nir_def * size,enum gl_access_qualifier dest_access,enum gl_access_qualifier src_access)1694 nir_memcpy_deref_with_access(nir_builder *build, nir_deref_instr *dest,
1695 nir_deref_instr *src, nir_def *size,
1696 enum gl_access_qualifier dest_access,
1697 enum gl_access_qualifier src_access)
1698 {
1699 nir_build_memcpy_deref(build, &dest->def, &src->def,
1700 size, dest_access, src_access);
1701 }
1702
1703 #undef nir_memcpy_deref
1704 static inline void
nir_memcpy_deref(nir_builder * build,nir_deref_instr * dest,nir_deref_instr * src,nir_def * size)1705 nir_memcpy_deref(nir_builder *build, nir_deref_instr *dest,
1706 nir_deref_instr *src, nir_def *size)
1707 {
1708 nir_memcpy_deref_with_access(build, dest, src, size,
1709 (enum gl_access_qualifier)0,
1710 (enum gl_access_qualifier)0);
1711 }
1712
1713 static inline nir_def *
nir_load_var(nir_builder * build,nir_variable * var)1714 nir_load_var(nir_builder *build, nir_variable *var)
1715 {
1716 return nir_load_deref(build, nir_build_deref_var(build, var));
1717 }
1718
1719 static inline void
nir_store_var(nir_builder * build,nir_variable * var,nir_def * value,unsigned writemask)1720 nir_store_var(nir_builder *build, nir_variable *var, nir_def *value,
1721 unsigned writemask)
1722 {
1723 nir_store_deref(build, nir_build_deref_var(build, var), value, writemask);
1724 }
1725
1726 static inline void
nir_copy_var(nir_builder * build,nir_variable * dest,nir_variable * src)1727 nir_copy_var(nir_builder *build, nir_variable *dest, nir_variable *src)
1728 {
1729 nir_copy_deref(build, nir_build_deref_var(build, dest),
1730 nir_build_deref_var(build, src));
1731 }
1732
1733 static inline nir_def *
nir_load_array_var(nir_builder * build,nir_variable * var,nir_def * index)1734 nir_load_array_var(nir_builder *build, nir_variable *var, nir_def *index)
1735 {
1736 nir_deref_instr *deref =
1737 nir_build_deref_array(build, nir_build_deref_var(build, var), index);
1738 return nir_load_deref(build, deref);
1739 }
1740
1741 static inline nir_def *
nir_load_array_var_imm(nir_builder * build,nir_variable * var,int64_t index)1742 nir_load_array_var_imm(nir_builder *build, nir_variable *var, int64_t index)
1743 {
1744 nir_deref_instr *deref =
1745 nir_build_deref_array_imm(build, nir_build_deref_var(build, var), index);
1746 return nir_load_deref(build, deref);
1747 }
1748
1749 static inline void
nir_store_array_var(nir_builder * build,nir_variable * var,nir_def * index,nir_def * value,unsigned writemask)1750 nir_store_array_var(nir_builder *build, nir_variable *var, nir_def *index,
1751 nir_def *value, unsigned writemask)
1752 {
1753 nir_deref_instr *deref =
1754 nir_build_deref_array(build, nir_build_deref_var(build, var), index);
1755 nir_store_deref(build, deref, value, writemask);
1756 }
1757
1758 static inline void
nir_store_array_var_imm(nir_builder * build,nir_variable * var,int64_t index,nir_def * value,unsigned writemask)1759 nir_store_array_var_imm(nir_builder *build, nir_variable *var, int64_t index,
1760 nir_def *value, unsigned writemask)
1761 {
1762 nir_deref_instr *deref =
1763 nir_build_deref_array_imm(build, nir_build_deref_var(build, var), index);
1764 nir_store_deref(build, deref, value, writemask);
1765 }
1766
1767 #undef nir_load_global
1768 static inline nir_def *
nir_load_global(nir_builder * build,nir_def * addr,unsigned align,unsigned num_components,unsigned bit_size)1769 nir_load_global(nir_builder *build, nir_def *addr, unsigned align,
1770 unsigned num_components, unsigned bit_size)
1771 {
1772 nir_intrinsic_instr *load =
1773 nir_intrinsic_instr_create(build->shader, nir_intrinsic_load_global);
1774 load->num_components = num_components;
1775 load->src[0] = nir_src_for_ssa(addr);
1776 nir_intrinsic_set_align(load, align, 0);
1777 nir_def_init(&load->instr, &load->def, num_components, bit_size);
1778 nir_builder_instr_insert(build, &load->instr);
1779 return &load->def;
1780 }
1781
1782 #undef nir_store_global
1783 static inline void
nir_store_global(nir_builder * build,nir_def * addr,unsigned align,nir_def * value,nir_component_mask_t write_mask)1784 nir_store_global(nir_builder *build, nir_def *addr, unsigned align,
1785 nir_def *value, nir_component_mask_t write_mask)
1786 {
1787 nir_intrinsic_instr *store =
1788 nir_intrinsic_instr_create(build->shader, nir_intrinsic_store_global);
1789 store->num_components = value->num_components;
1790 store->src[0] = nir_src_for_ssa(value);
1791 store->src[1] = nir_src_for_ssa(addr);
1792 nir_intrinsic_set_write_mask(store,
1793 write_mask & BITFIELD_MASK(value->num_components));
1794 nir_intrinsic_set_align(store, align, 0);
1795 nir_builder_instr_insert(build, &store->instr);
1796 }
1797
1798 #undef nir_load_global_constant
1799 static inline nir_def *
nir_load_global_constant(nir_builder * build,nir_def * addr,unsigned align,unsigned num_components,unsigned bit_size)1800 nir_load_global_constant(nir_builder *build, nir_def *addr, unsigned align,
1801 unsigned num_components, unsigned bit_size)
1802 {
1803 nir_intrinsic_instr *load =
1804 nir_intrinsic_instr_create(build->shader, nir_intrinsic_load_global_constant);
1805 load->num_components = num_components;
1806 load->src[0] = nir_src_for_ssa(addr);
1807 nir_intrinsic_set_align(load, align, 0);
1808 nir_def_init(&load->instr, &load->def, num_components, bit_size);
1809 nir_builder_instr_insert(build, &load->instr);
1810 return &load->def;
1811 }
1812
1813 #undef nir_load_param
1814 static inline nir_def *
nir_load_param(nir_builder * build,uint32_t param_idx)1815 nir_load_param(nir_builder *build, uint32_t param_idx)
1816 {
1817 assert(param_idx < build->impl->function->num_params);
1818 nir_parameter *param = &build->impl->function->params[param_idx];
1819 return nir_build_load_param(build, param->num_components, param->bit_size, param_idx);
1820 }
1821
1822 #undef nir_decl_reg
1823 static inline nir_def *
nir_decl_reg(nir_builder * b,unsigned num_components,unsigned bit_size,unsigned num_array_elems)1824 nir_decl_reg(nir_builder *b, unsigned num_components, unsigned bit_size,
1825 unsigned num_array_elems)
1826 {
1827 nir_intrinsic_instr *decl =
1828 nir_intrinsic_instr_create(b->shader, nir_intrinsic_decl_reg);
1829 nir_intrinsic_set_num_components(decl, num_components);
1830 nir_intrinsic_set_bit_size(decl, bit_size);
1831 nir_intrinsic_set_num_array_elems(decl, num_array_elems);
1832 nir_intrinsic_set_divergent(decl, true);
1833 nir_def_init(&decl->instr, &decl->def, 1, 32);
1834
1835 nir_instr_insert(nir_before_impl(b->impl), &decl->instr);
1836
1837 return &decl->def;
1838 }
1839
1840 #undef nir_load_reg
1841 static inline nir_def *
nir_load_reg(nir_builder * b,nir_def * reg)1842 nir_load_reg(nir_builder *b, nir_def *reg)
1843 {
1844 nir_intrinsic_instr *decl = nir_reg_get_decl(reg);
1845 unsigned num_components = nir_intrinsic_num_components(decl);
1846 unsigned bit_size = nir_intrinsic_bit_size(decl);
1847
1848 nir_def *res = nir_build_load_reg(b, num_components, bit_size, reg);
1849 res->divergent = nir_intrinsic_divergent(decl);
1850
1851 return res;
1852 }
1853
1854 #undef nir_store_reg
1855 static inline void
nir_store_reg(nir_builder * b,nir_def * value,nir_def * reg)1856 nir_store_reg(nir_builder *b, nir_def *value, nir_def *reg)
1857 {
1858 ASSERTED nir_intrinsic_instr *decl = nir_reg_get_decl(reg);
1859 ASSERTED unsigned num_components = nir_intrinsic_num_components(decl);
1860 ASSERTED unsigned bit_size = nir_intrinsic_bit_size(decl);
1861
1862 assert(value->num_components == num_components);
1863 assert(value->bit_size == bit_size);
1864
1865 nir_build_store_reg(b, value, reg);
1866 }
1867
1868 static inline nir_tex_src
nir_tex_src_for_ssa(nir_tex_src_type src_type,nir_def * def)1869 nir_tex_src_for_ssa(nir_tex_src_type src_type, nir_def *def)
1870 {
1871 nir_tex_src src;
1872 src.src = nir_src_for_ssa(def);
1873 src.src_type = src_type;
1874 return src;
1875 }
1876
1877 /*
1878 * Find a texture source, remove it, and return its nir_def. If the texture
1879 * source does not exist, return NULL. This is useful for texture lowering pass
1880 * that consume their input sources and produce a new lowered source.
1881 */
1882 static inline nir_def *
nir_steal_tex_src(nir_tex_instr * tex,nir_tex_src_type type_)1883 nir_steal_tex_src(nir_tex_instr *tex, nir_tex_src_type type_)
1884 {
1885 int idx = nir_tex_instr_src_index(tex, type_);
1886 if (idx < 0)
1887 return NULL;
1888
1889 nir_def *ssa = tex->src[idx].src.ssa;
1890 nir_tex_instr_remove_src(tex, idx);
1891 return ssa;
1892 }
1893
1894 static inline nir_def *
nir_tex_deref(nir_builder * b,nir_deref_instr * t,nir_deref_instr * s,nir_def * coord)1895 nir_tex_deref(nir_builder *b, nir_deref_instr *t, nir_deref_instr *s,
1896 nir_def *coord)
1897 {
1898 nir_tex_src srcs[] = { nir_tex_src_for_ssa(nir_tex_src_coord, coord) };
1899
1900 return nir_build_tex_deref_instr(b, nir_texop_tex, t, s,
1901 ARRAY_SIZE(srcs), srcs);
1902 }
1903
1904 static inline nir_def *
nir_txl_deref(nir_builder * b,nir_deref_instr * t,nir_deref_instr * s,nir_def * coord,nir_def * lod)1905 nir_txl_deref(nir_builder *b, nir_deref_instr *t, nir_deref_instr *s,
1906 nir_def *coord, nir_def *lod)
1907 {
1908 nir_tex_src srcs[] = {
1909 nir_tex_src_for_ssa(nir_tex_src_coord, coord),
1910 nir_tex_src_for_ssa(nir_tex_src_lod, lod),
1911 };
1912
1913 return nir_build_tex_deref_instr(b, nir_texop_txl, t, s,
1914 ARRAY_SIZE(srcs), srcs);
1915 }
1916
1917 static inline nir_def *
nir_txl_zero_deref(nir_builder * b,nir_deref_instr * t,nir_deref_instr * s,nir_def * coord)1918 nir_txl_zero_deref(nir_builder *b, nir_deref_instr *t, nir_deref_instr *s,
1919 nir_def *coord)
1920 {
1921 return nir_txl_deref(b, t, s, coord, nir_imm_float(b, 0));
1922 }
1923
1924 static inline bool
nir_tex_type_has_lod(const struct glsl_type * tex_type)1925 nir_tex_type_has_lod(const struct glsl_type *tex_type)
1926 {
1927 switch (glsl_get_sampler_dim(tex_type)) {
1928 case GLSL_SAMPLER_DIM_1D:
1929 case GLSL_SAMPLER_DIM_2D:
1930 case GLSL_SAMPLER_DIM_3D:
1931 case GLSL_SAMPLER_DIM_CUBE:
1932 return true;
1933 default:
1934 return false;
1935 }
1936 }
1937
1938 static inline nir_def *
nir_txf_deref(nir_builder * b,nir_deref_instr * t,nir_def * coord,nir_def * lod)1939 nir_txf_deref(nir_builder *b, nir_deref_instr *t,
1940 nir_def *coord, nir_def *lod)
1941 {
1942 nir_tex_src srcs[2];
1943 unsigned num_srcs = 0;
1944
1945 srcs[num_srcs++] = nir_tex_src_for_ssa(nir_tex_src_coord, coord);
1946
1947 if (lod == NULL && nir_tex_type_has_lod(t->type))
1948 lod = nir_imm_int(b, 0);
1949
1950 if (lod != NULL)
1951 srcs[num_srcs++] = nir_tex_src_for_ssa(nir_tex_src_lod, lod);
1952
1953 return nir_build_tex_deref_instr(b, nir_texop_txf, t, NULL,
1954 num_srcs, srcs);
1955 }
1956
1957 static inline nir_def *
nir_txf_ms_deref(nir_builder * b,nir_deref_instr * t,nir_def * coord,nir_def * ms_index)1958 nir_txf_ms_deref(nir_builder *b, nir_deref_instr *t,
1959 nir_def *coord, nir_def *ms_index)
1960 {
1961 nir_tex_src srcs[] = {
1962 nir_tex_src_for_ssa(nir_tex_src_coord, coord),
1963 nir_tex_src_for_ssa(nir_tex_src_ms_index, ms_index),
1964 };
1965
1966 return nir_build_tex_deref_instr(b, nir_texop_txf_ms, t, NULL,
1967 ARRAY_SIZE(srcs), srcs);
1968 }
1969
1970 static inline nir_def *
nir_txs_deref(nir_builder * b,nir_deref_instr * t,nir_def * lod)1971 nir_txs_deref(nir_builder *b, nir_deref_instr *t, nir_def *lod)
1972 {
1973 nir_tex_src srcs[1];
1974 unsigned num_srcs = 0;
1975
1976 if (lod == NULL && nir_tex_type_has_lod(t->type))
1977 lod = nir_imm_int(b, 0);
1978
1979 if (lod != NULL)
1980 srcs[num_srcs++] = nir_tex_src_for_ssa(nir_tex_src_lod, lod);
1981
1982 return nir_build_tex_deref_instr(b, nir_texop_txs, t, NULL,
1983 num_srcs, srcs);
1984 }
1985
1986 static inline nir_def *
nir_samples_identical_deref(nir_builder * b,nir_deref_instr * t,nir_def * coord)1987 nir_samples_identical_deref(nir_builder *b, nir_deref_instr *t,
1988 nir_def *coord)
1989 {
1990 nir_tex_src srcs[] = { nir_tex_src_for_ssa(nir_tex_src_coord, coord) };
1991
1992 return nir_build_tex_deref_instr(b, nir_texop_samples_identical, t, NULL,
1993 ARRAY_SIZE(srcs), srcs);
1994 }
1995
1996 /* calculate a `(1 << value) - 1` in ssa without overflows */
1997 static inline nir_def *
nir_mask(nir_builder * b,nir_def * bits,unsigned dst_bit_size)1998 nir_mask(nir_builder *b, nir_def *bits, unsigned dst_bit_size)
1999 {
2000 return nir_ushr(b, nir_imm_intN_t(b, -1, dst_bit_size),
2001 nir_isub_imm(b, dst_bit_size, nir_u2u32(b, bits)));
2002 }
2003
2004 static inline nir_def *
nir_load_barycentric(nir_builder * build,nir_intrinsic_op op,unsigned interp_mode)2005 nir_load_barycentric(nir_builder *build, nir_intrinsic_op op,
2006 unsigned interp_mode)
2007 {
2008 unsigned num_components = op == nir_intrinsic_load_barycentric_model ? 3 : 2;
2009 nir_intrinsic_instr *bary = nir_intrinsic_instr_create(build->shader, op);
2010 nir_def_init(&bary->instr, &bary->def, num_components, 32);
2011 nir_intrinsic_set_interp_mode(bary, interp_mode);
2012 nir_builder_instr_insert(build, &bary->instr);
2013 return &bary->def;
2014 }
2015
2016 static inline void
nir_jump(nir_builder * build,nir_jump_type jump_type)2017 nir_jump(nir_builder *build, nir_jump_type jump_type)
2018 {
2019 assert(jump_type != nir_jump_goto && jump_type != nir_jump_goto_if);
2020 nir_jump_instr *jump = nir_jump_instr_create(build->shader, jump_type);
2021 nir_builder_instr_insert(build, &jump->instr);
2022 }
2023
2024 static inline void
nir_goto(nir_builder * build,struct nir_block * target)2025 nir_goto(nir_builder *build, struct nir_block *target)
2026 {
2027 assert(!build->impl->structured);
2028 nir_jump_instr *jump = nir_jump_instr_create(build->shader, nir_jump_goto);
2029 jump->target = target;
2030 nir_builder_instr_insert(build, &jump->instr);
2031 }
2032
2033 static inline void
nir_goto_if(nir_builder * build,struct nir_block * target,nir_src cond,struct nir_block * else_target)2034 nir_goto_if(nir_builder *build, struct nir_block *target, nir_src cond,
2035 struct nir_block *else_target)
2036 {
2037 assert(!build->impl->structured);
2038 nir_jump_instr *jump = nir_jump_instr_create(build->shader, nir_jump_goto_if);
2039 jump->condition = cond;
2040 jump->target = target;
2041 jump->else_target = else_target;
2042 nir_builder_instr_insert(build, &jump->instr);
2043 }
2044
2045 static inline void
nir_build_call(nir_builder * build,nir_function * func,size_t count,nir_def ** args)2046 nir_build_call(nir_builder *build, nir_function *func, size_t count,
2047 nir_def **args)
2048 {
2049 assert(count == func->num_params && "parameter count must match");
2050 nir_call_instr *call = nir_call_instr_create(build->shader, func);
2051
2052 for (unsigned i = 0; i < count; ++i) {
2053 call->params[i] = nir_src_for_ssa(args[i]);
2054 }
2055
2056 nir_builder_instr_insert(build, &call->instr);
2057 }
2058
2059 /*
2060 * Call a given nir_function * with a variadic number of nir_def * arguments.
2061 *
2062 * Defined with __VA_ARGS__ instead of va_list so we can assert the correct
2063 * number of parameters are passed in.
2064 */
2065 #define nir_call(build, func, ...) \
2066 do { \
2067 nir_def *args[] = { __VA_ARGS__ }; \
2068 nir_build_call(build, func, ARRAY_SIZE(args), args); \
2069 } while (0)
2070
2071 nir_def *
2072 nir_compare_func(nir_builder *b, enum compare_func func,
2073 nir_def *src0, nir_def *src1);
2074
2075 static inline void
nir_scoped_memory_barrier(nir_builder * b,mesa_scope scope,nir_memory_semantics semantics,nir_variable_mode modes)2076 nir_scoped_memory_barrier(nir_builder *b,
2077 mesa_scope scope,
2078 nir_memory_semantics semantics,
2079 nir_variable_mode modes)
2080 {
2081 nir_barrier(b, SCOPE_NONE, scope, semantics, modes);
2082 }
2083
2084 nir_def *
2085 nir_gen_rect_vertices(nir_builder *b, nir_def *z, nir_def *w);
2086
2087 #ifdef __cplusplus
2088 } /* extern "C" */
2089 #endif
2090
2091 #endif /* NIR_BUILDER_H */
2092