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