Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/mesa
Path: blob/21.2-virgl/src/compiler/nir/nir_builder.h
4545 views
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 "nir_control_flow.h"
28
#include "util/bitscan.h"
29
#include "util/half_float.h"
30
31
struct exec_list;
32
33
typedef struct nir_builder {
34
nir_cursor cursor;
35
36
/* Whether new ALU instructions will be marked "exact" */
37
bool exact;
38
39
/* Whether to run divergence analysis on inserted instructions (loop merge
40
* and header phis are not updated). */
41
bool update_divergence;
42
43
nir_shader *shader;
44
nir_function_impl *impl;
45
} nir_builder;
46
47
static inline void
48
nir_builder_init(nir_builder *build, nir_function_impl *impl)
49
{
50
memset(build, 0, sizeof(*build));
51
build->exact = false;
52
build->impl = impl;
53
build->shader = impl->function->shader;
54
}
55
56
static inline nir_builder MUST_CHECK PRINTFLIKE(3, 4)
57
nir_builder_init_simple_shader(gl_shader_stage stage,
58
const nir_shader_compiler_options *options,
59
const char *name, ...)
60
{
61
nir_builder b;
62
63
memset(&b, 0, sizeof(b));
64
b.shader = nir_shader_create(NULL, stage, options, NULL);
65
66
if (name) {
67
va_list args;
68
va_start(args, name);
69
b.shader->info.name = ralloc_vasprintf(b.shader, name, args);
70
va_end(args);
71
}
72
73
nir_function *func = nir_function_create(b.shader, "main");
74
func->is_entrypoint = true;
75
b.exact = false;
76
b.impl = nir_function_impl_create(func);
77
b.cursor = nir_after_cf_list(&b.impl->body);
78
79
return b;
80
}
81
82
typedef bool (*nir_instr_pass_cb)(struct nir_builder *, nir_instr *, void *);
83
84
/**
85
* Iterates over all the instructions in a NIR shader and calls the given pass
86
* on them.
87
*
88
* The pass should return true if it modified the shader. In that case, only
89
* the preserved metadata flags will be preserved in the function impl.
90
*
91
* The builder will be initialized to point at the function impl, but its
92
* cursor is unset.
93
*/
94
static inline bool
95
nir_shader_instructions_pass(nir_shader *shader,
96
nir_instr_pass_cb pass,
97
nir_metadata preserved,
98
void *cb_data)
99
{
100
bool progress = false;
101
102
nir_foreach_function(function, shader) {
103
if (!function->impl)
104
continue;
105
106
bool func_progress = false;
107
nir_builder b;
108
nir_builder_init(&b, function->impl);
109
110
nir_foreach_block_safe(block, function->impl) {
111
nir_foreach_instr_safe(instr, block) {
112
func_progress |= pass(&b, instr, cb_data);
113
}
114
}
115
116
if (func_progress) {
117
nir_metadata_preserve(function->impl, preserved);
118
progress = true;
119
} else {
120
nir_metadata_preserve(function->impl, nir_metadata_all);
121
}
122
}
123
124
return progress;
125
}
126
127
static inline void
128
nir_builder_instr_insert(nir_builder *build, nir_instr *instr)
129
{
130
nir_instr_insert(build->cursor, instr);
131
132
if (build->update_divergence)
133
nir_update_instr_divergence(build->shader, instr);
134
135
/* Move the cursor forward. */
136
build->cursor = nir_after_instr(instr);
137
}
138
139
static inline nir_instr *
140
nir_builder_last_instr(nir_builder *build)
141
{
142
assert(build->cursor.option == nir_cursor_after_instr);
143
return build->cursor.instr;
144
}
145
146
static inline void
147
nir_builder_cf_insert(nir_builder *build, nir_cf_node *cf)
148
{
149
nir_cf_node_insert(build->cursor, cf);
150
}
151
152
static inline bool
153
nir_builder_is_inside_cf(nir_builder *build, nir_cf_node *cf_node)
154
{
155
nir_block *block = nir_cursor_current_block(build->cursor);
156
for (nir_cf_node *n = &block->cf_node; n; n = n->parent) {
157
if (n == cf_node)
158
return true;
159
}
160
return false;
161
}
162
163
static inline nir_if *
164
nir_push_if_src(nir_builder *build, nir_src condition)
165
{
166
nir_if *nif = nir_if_create(build->shader);
167
nif->condition = condition;
168
nir_builder_cf_insert(build, &nif->cf_node);
169
build->cursor = nir_before_cf_list(&nif->then_list);
170
return nif;
171
}
172
173
static inline nir_if *
174
nir_push_if(nir_builder *build, nir_ssa_def *condition)
175
{
176
return nir_push_if_src(build, nir_src_for_ssa(condition));
177
}
178
179
static inline nir_if *
180
nir_push_else(nir_builder *build, nir_if *nif)
181
{
182
if (nif) {
183
assert(nir_builder_is_inside_cf(build, &nif->cf_node));
184
} else {
185
nir_block *block = nir_cursor_current_block(build->cursor);
186
nif = nir_cf_node_as_if(block->cf_node.parent);
187
}
188
build->cursor = nir_before_cf_list(&nif->else_list);
189
return nif;
190
}
191
192
static inline void
193
nir_pop_if(nir_builder *build, nir_if *nif)
194
{
195
if (nif) {
196
assert(nir_builder_is_inside_cf(build, &nif->cf_node));
197
} else {
198
nir_block *block = nir_cursor_current_block(build->cursor);
199
nif = nir_cf_node_as_if(block->cf_node.parent);
200
}
201
build->cursor = nir_after_cf_node(&nif->cf_node);
202
}
203
204
static inline nir_ssa_def *
205
nir_if_phi(nir_builder *build, nir_ssa_def *then_def, nir_ssa_def *else_def)
206
{
207
nir_block *block = nir_cursor_current_block(build->cursor);
208
nir_if *nif = nir_cf_node_as_if(nir_cf_node_prev(&block->cf_node));
209
210
nir_phi_instr *phi = nir_phi_instr_create(build->shader);
211
212
nir_phi_src *src = ralloc(phi, nir_phi_src);
213
src->pred = nir_if_last_then_block(nif);
214
src->src = nir_src_for_ssa(then_def);
215
exec_list_push_tail(&phi->srcs, &src->node);
216
217
src = ralloc(phi, nir_phi_src);
218
src->pred = nir_if_last_else_block(nif);
219
src->src = nir_src_for_ssa(else_def);
220
exec_list_push_tail(&phi->srcs, &src->node);
221
222
assert(then_def->num_components == else_def->num_components);
223
assert(then_def->bit_size == else_def->bit_size);
224
nir_ssa_dest_init(&phi->instr, &phi->dest,
225
then_def->num_components, then_def->bit_size, NULL);
226
227
nir_builder_instr_insert(build, &phi->instr);
228
229
return &phi->dest.ssa;
230
}
231
232
static inline nir_loop *
233
nir_push_loop(nir_builder *build)
234
{
235
nir_loop *loop = nir_loop_create(build->shader);
236
nir_builder_cf_insert(build, &loop->cf_node);
237
build->cursor = nir_before_cf_list(&loop->body);
238
return loop;
239
}
240
241
static inline void
242
nir_pop_loop(nir_builder *build, nir_loop *loop)
243
{
244
if (loop) {
245
assert(nir_builder_is_inside_cf(build, &loop->cf_node));
246
} else {
247
nir_block *block = nir_cursor_current_block(build->cursor);
248
loop = nir_cf_node_as_loop(block->cf_node.parent);
249
}
250
build->cursor = nir_after_cf_node(&loop->cf_node);
251
}
252
253
static inline nir_ssa_def *
254
nir_ssa_undef(nir_builder *build, unsigned num_components, unsigned bit_size)
255
{
256
nir_ssa_undef_instr *undef =
257
nir_ssa_undef_instr_create(build->shader, num_components, bit_size);
258
if (!undef)
259
return NULL;
260
261
nir_instr_insert(nir_before_cf_list(&build->impl->body), &undef->instr);
262
if (build->update_divergence)
263
nir_update_instr_divergence(build->shader, &undef->instr);
264
265
return &undef->def;
266
}
267
268
static inline nir_ssa_def *
269
nir_build_imm(nir_builder *build, unsigned num_components,
270
unsigned bit_size, const nir_const_value *value)
271
{
272
nir_load_const_instr *load_const =
273
nir_load_const_instr_create(build->shader, num_components, bit_size);
274
if (!load_const)
275
return NULL;
276
277
memcpy(load_const->value, value, sizeof(nir_const_value) * num_components);
278
279
nir_builder_instr_insert(build, &load_const->instr);
280
281
return &load_const->def;
282
}
283
284
static inline nir_ssa_def *
285
nir_imm_zero(nir_builder *build, unsigned num_components, unsigned bit_size)
286
{
287
nir_load_const_instr *load_const =
288
nir_load_const_instr_create(build->shader, num_components, bit_size);
289
290
/* nir_load_const_instr_create uses rzalloc so it's already zero */
291
292
nir_builder_instr_insert(build, &load_const->instr);
293
294
return &load_const->def;
295
}
296
297
static inline nir_ssa_def *
298
nir_imm_boolN_t(nir_builder *build, bool x, unsigned bit_size)
299
{
300
nir_const_value v = nir_const_value_for_bool(x, bit_size);
301
return nir_build_imm(build, 1, bit_size, &v);
302
}
303
304
static inline nir_ssa_def *
305
nir_imm_bool(nir_builder *build, bool x)
306
{
307
return nir_imm_boolN_t(build, x, 1);
308
}
309
310
static inline nir_ssa_def *
311
nir_imm_true(nir_builder *build)
312
{
313
return nir_imm_bool(build, true);
314
}
315
316
static inline nir_ssa_def *
317
nir_imm_false(nir_builder *build)
318
{
319
return nir_imm_bool(build, false);
320
}
321
322
static inline nir_ssa_def *
323
nir_imm_floatN_t(nir_builder *build, double x, unsigned bit_size)
324
{
325
nir_const_value v = nir_const_value_for_float(x, bit_size);
326
return nir_build_imm(build, 1, bit_size, &v);
327
}
328
329
static inline nir_ssa_def *
330
nir_imm_float16(nir_builder *build, float x)
331
{
332
return nir_imm_floatN_t(build, x, 16);
333
}
334
335
static inline nir_ssa_def *
336
nir_imm_float(nir_builder *build, float x)
337
{
338
return nir_imm_floatN_t(build, x, 32);
339
}
340
341
static inline nir_ssa_def *
342
nir_imm_double(nir_builder *build, double x)
343
{
344
return nir_imm_floatN_t(build, x, 64);
345
}
346
347
static inline nir_ssa_def *
348
nir_imm_vec2(nir_builder *build, float x, float y)
349
{
350
nir_const_value v[2] = {
351
nir_const_value_for_float(x, 32),
352
nir_const_value_for_float(y, 32),
353
};
354
return nir_build_imm(build, 2, 32, v);
355
}
356
357
static inline nir_ssa_def *
358
nir_imm_vec4(nir_builder *build, float x, float y, float z, float w)
359
{
360
nir_const_value v[4] = {
361
nir_const_value_for_float(x, 32),
362
nir_const_value_for_float(y, 32),
363
nir_const_value_for_float(z, 32),
364
nir_const_value_for_float(w, 32),
365
};
366
367
return nir_build_imm(build, 4, 32, v);
368
}
369
370
static inline nir_ssa_def *
371
nir_imm_vec4_16(nir_builder *build, float x, float y, float z, float w)
372
{
373
nir_const_value v[4] = {
374
nir_const_value_for_float(x, 16),
375
nir_const_value_for_float(y, 16),
376
nir_const_value_for_float(z, 16),
377
nir_const_value_for_float(w, 16),
378
};
379
380
return nir_build_imm(build, 4, 16, v);
381
}
382
383
static inline nir_ssa_def *
384
nir_imm_intN_t(nir_builder *build, uint64_t x, unsigned bit_size)
385
{
386
nir_const_value v = nir_const_value_for_raw_uint(x, bit_size);
387
return nir_build_imm(build, 1, bit_size, &v);
388
}
389
390
static inline nir_ssa_def *
391
nir_imm_int(nir_builder *build, int x)
392
{
393
return nir_imm_intN_t(build, x, 32);
394
}
395
396
static inline nir_ssa_def *
397
nir_imm_int64(nir_builder *build, int64_t x)
398
{
399
return nir_imm_intN_t(build, x, 64);
400
}
401
402
static inline nir_ssa_def *
403
nir_imm_ivec2(nir_builder *build, int x, int y)
404
{
405
nir_const_value v[2] = {
406
nir_const_value_for_int(x, 32),
407
nir_const_value_for_int(y, 32),
408
};
409
410
return nir_build_imm(build, 2, 32, v);
411
}
412
413
static inline nir_ssa_def *
414
nir_imm_ivec4(nir_builder *build, int x, int y, int z, int w)
415
{
416
nir_const_value v[4] = {
417
nir_const_value_for_int(x, 32),
418
nir_const_value_for_int(y, 32),
419
nir_const_value_for_int(z, 32),
420
nir_const_value_for_int(w, 32),
421
};
422
423
return nir_build_imm(build, 4, 32, v);
424
}
425
426
static inline nir_ssa_def *
427
nir_builder_alu_instr_finish_and_insert(nir_builder *build, nir_alu_instr *instr)
428
{
429
const nir_op_info *op_info = &nir_op_infos[instr->op];
430
431
instr->exact = build->exact;
432
433
/* Guess the number of components the destination temporary should have
434
* based on our input sizes, if it's not fixed for the op.
435
*/
436
unsigned num_components = op_info->output_size;
437
if (num_components == 0) {
438
for (unsigned i = 0; i < op_info->num_inputs; i++) {
439
if (op_info->input_sizes[i] == 0)
440
num_components = MAX2(num_components,
441
instr->src[i].src.ssa->num_components);
442
}
443
}
444
assert(num_components != 0);
445
446
/* Figure out the bitwidth based on the source bitwidth if the instruction
447
* is variable-width.
448
*/
449
unsigned bit_size = nir_alu_type_get_type_size(op_info->output_type);
450
if (bit_size == 0) {
451
for (unsigned i = 0; i < op_info->num_inputs; i++) {
452
unsigned src_bit_size = instr->src[i].src.ssa->bit_size;
453
if (nir_alu_type_get_type_size(op_info->input_types[i]) == 0) {
454
if (bit_size)
455
assert(src_bit_size == bit_size);
456
else
457
bit_size = src_bit_size;
458
} else {
459
assert(src_bit_size ==
460
nir_alu_type_get_type_size(op_info->input_types[i]));
461
}
462
}
463
}
464
465
/* When in doubt, assume 32. */
466
if (bit_size == 0)
467
bit_size = 32;
468
469
/* Make sure we don't swizzle from outside of our source vector (like if a
470
* scalar value was passed into a multiply with a vector).
471
*/
472
for (unsigned i = 0; i < op_info->num_inputs; i++) {
473
for (unsigned j = instr->src[i].src.ssa->num_components;
474
j < NIR_MAX_VEC_COMPONENTS; j++) {
475
instr->src[i].swizzle[j] = instr->src[i].src.ssa->num_components - 1;
476
}
477
}
478
479
nir_ssa_dest_init(&instr->instr, &instr->dest.dest, num_components,
480
bit_size, NULL);
481
instr->dest.write_mask = (1 << num_components) - 1;
482
483
nir_builder_instr_insert(build, &instr->instr);
484
485
return &instr->dest.dest.ssa;
486
}
487
488
static inline nir_ssa_def *
489
nir_build_alu(nir_builder *build, nir_op op, nir_ssa_def *src0,
490
nir_ssa_def *src1, nir_ssa_def *src2, nir_ssa_def *src3)
491
{
492
nir_alu_instr *instr = nir_alu_instr_create(build->shader, op);
493
if (!instr)
494
return NULL;
495
496
instr->src[0].src = nir_src_for_ssa(src0);
497
if (src1)
498
instr->src[1].src = nir_src_for_ssa(src1);
499
if (src2)
500
instr->src[2].src = nir_src_for_ssa(src2);
501
if (src3)
502
instr->src[3].src = nir_src_for_ssa(src3);
503
504
return nir_builder_alu_instr_finish_and_insert(build, instr);
505
}
506
507
/* for the couple special cases with more than 4 src args: */
508
static inline nir_ssa_def *
509
nir_build_alu_src_arr(nir_builder *build, nir_op op, nir_ssa_def **srcs)
510
{
511
const nir_op_info *op_info = &nir_op_infos[op];
512
nir_alu_instr *instr = nir_alu_instr_create(build->shader, op);
513
if (!instr)
514
return NULL;
515
516
for (unsigned i = 0; i < op_info->num_inputs; i++)
517
instr->src[i].src = nir_src_for_ssa(srcs[i]);
518
519
return nir_builder_alu_instr_finish_and_insert(build, instr);
520
}
521
522
/* Generic builder for system values. */
523
static inline nir_ssa_def *
524
nir_load_system_value(nir_builder *build, nir_intrinsic_op op, int index,
525
unsigned num_components, unsigned bit_size)
526
{
527
nir_intrinsic_instr *load = nir_intrinsic_instr_create(build->shader, op);
528
if (nir_intrinsic_infos[op].dest_components > 0)
529
assert(num_components == nir_intrinsic_infos[op].dest_components);
530
else
531
load->num_components = num_components;
532
load->const_index[0] = index;
533
534
nir_ssa_dest_init(&load->instr, &load->dest,
535
num_components, bit_size, NULL);
536
nir_builder_instr_insert(build, &load->instr);
537
return &load->dest.ssa;
538
}
539
540
#include "nir_builder_opcodes.h"
541
#undef nir_deref_mode_is
542
543
static inline nir_ssa_def *
544
nir_vec(nir_builder *build, nir_ssa_def **comp, unsigned num_components)
545
{
546
return nir_build_alu_src_arr(build, nir_op_vec(num_components), comp);
547
}
548
549
static inline nir_ssa_def *
550
nir_mov_alu(nir_builder *build, nir_alu_src src, unsigned num_components)
551
{
552
assert(!src.abs && !src.negate);
553
if (src.src.is_ssa && src.src.ssa->num_components == num_components) {
554
bool any_swizzles = false;
555
for (unsigned i = 0; i < num_components; i++) {
556
if (src.swizzle[i] != i)
557
any_swizzles = true;
558
}
559
if (!any_swizzles)
560
return src.src.ssa;
561
}
562
563
nir_alu_instr *mov = nir_alu_instr_create(build->shader, nir_op_mov);
564
nir_ssa_dest_init(&mov->instr, &mov->dest.dest, num_components,
565
nir_src_bit_size(src.src), NULL);
566
mov->exact = build->exact;
567
mov->dest.write_mask = (1 << num_components) - 1;
568
mov->src[0] = src;
569
nir_builder_instr_insert(build, &mov->instr);
570
571
return &mov->dest.dest.ssa;
572
}
573
574
/**
575
* Construct a mov that reswizzles the source's components.
576
*/
577
static inline nir_ssa_def *
578
nir_swizzle(nir_builder *build, nir_ssa_def *src, const unsigned *swiz,
579
unsigned num_components)
580
{
581
assert(num_components <= NIR_MAX_VEC_COMPONENTS);
582
nir_alu_src alu_src = { NIR_SRC_INIT };
583
alu_src.src = nir_src_for_ssa(src);
584
585
bool is_identity_swizzle = true;
586
for (unsigned i = 0; i < num_components && i < NIR_MAX_VEC_COMPONENTS; i++) {
587
if (swiz[i] != i)
588
is_identity_swizzle = false;
589
alu_src.swizzle[i] = swiz[i];
590
}
591
592
if (num_components == src->num_components && is_identity_swizzle)
593
return src;
594
595
return nir_mov_alu(build, alu_src, num_components);
596
}
597
598
/* Selects the right fdot given the number of components in each source. */
599
static inline nir_ssa_def *
600
nir_fdot(nir_builder *build, nir_ssa_def *src0, nir_ssa_def *src1)
601
{
602
assert(src0->num_components == src1->num_components);
603
switch (src0->num_components) {
604
case 1: return nir_fmul(build, src0, src1);
605
case 2: return nir_fdot2(build, src0, src1);
606
case 3: return nir_fdot3(build, src0, src1);
607
case 4: return nir_fdot4(build, src0, src1);
608
case 5: return nir_fdot5(build, src0, src1);
609
case 8: return nir_fdot8(build, src0, src1);
610
case 16: return nir_fdot16(build, src0, src1);
611
default:
612
unreachable("bad component size");
613
}
614
615
return NULL;
616
}
617
618
static inline nir_ssa_def *
619
nir_ball_iequal(nir_builder *b, nir_ssa_def *src0, nir_ssa_def *src1)
620
{
621
switch (src0->num_components) {
622
case 1: return nir_ieq(b, src0, src1);
623
case 2: return nir_ball_iequal2(b, src0, src1);
624
case 3: return nir_ball_iequal3(b, src0, src1);
625
case 4: return nir_ball_iequal4(b, src0, src1);
626
case 5: return nir_ball_iequal5(b, src0, src1);
627
case 8: return nir_ball_iequal8(b, src0, src1);
628
case 16: return nir_ball_iequal16(b, src0, src1);
629
default:
630
unreachable("bad component size");
631
}
632
}
633
634
static inline nir_ssa_def *
635
nir_ball(nir_builder *b, nir_ssa_def *src)
636
{
637
return nir_ball_iequal(b, src, nir_imm_true(b));
638
}
639
640
static inline nir_ssa_def *
641
nir_bany_inequal(nir_builder *b, nir_ssa_def *src0, nir_ssa_def *src1)
642
{
643
switch (src0->num_components) {
644
case 1: return nir_ine(b, src0, src1);
645
case 2: return nir_bany_inequal2(b, src0, src1);
646
case 3: return nir_bany_inequal3(b, src0, src1);
647
case 4: return nir_bany_inequal4(b, src0, src1);
648
case 5: return nir_bany_inequal5(b, src0, src1);
649
case 8: return nir_bany_inequal8(b, src0, src1);
650
case 16: return nir_bany_inequal16(b, src0, src1);
651
default:
652
unreachable("bad component size");
653
}
654
}
655
656
static inline nir_ssa_def *
657
nir_bany(nir_builder *b, nir_ssa_def *src)
658
{
659
return nir_bany_inequal(b, src, nir_imm_false(b));
660
}
661
662
static inline nir_ssa_def *
663
nir_channel(nir_builder *b, nir_ssa_def *def, unsigned c)
664
{
665
return nir_swizzle(b, def, &c, 1);
666
}
667
668
static inline nir_ssa_def *
669
nir_channels(nir_builder *b, nir_ssa_def *def, nir_component_mask_t mask)
670
{
671
unsigned num_channels = 0, swizzle[NIR_MAX_VEC_COMPONENTS] = { 0 };
672
673
for (unsigned i = 0; i < NIR_MAX_VEC_COMPONENTS; i++) {
674
if ((mask & (1 << i)) == 0)
675
continue;
676
swizzle[num_channels++] = i;
677
}
678
679
return nir_swizzle(b, def, swizzle, num_channels);
680
}
681
682
static inline nir_ssa_def *
683
_nir_select_from_array_helper(nir_builder *b, nir_ssa_def **arr,
684
nir_ssa_def *idx,
685
unsigned start, unsigned end)
686
{
687
if (start == end - 1) {
688
return arr[start];
689
} else {
690
unsigned mid = start + (end - start) / 2;
691
return nir_bcsel(b, nir_ilt(b, idx, nir_imm_intN_t(b, mid, idx->bit_size)),
692
_nir_select_from_array_helper(b, arr, idx, start, mid),
693
_nir_select_from_array_helper(b, arr, idx, mid, end));
694
}
695
}
696
697
static inline nir_ssa_def *
698
nir_select_from_ssa_def_array(nir_builder *b, nir_ssa_def **arr,
699
unsigned arr_len, nir_ssa_def *idx)
700
{
701
return _nir_select_from_array_helper(b, arr, idx, 0, arr_len);
702
}
703
704
static inline nir_ssa_def *
705
nir_vector_extract(nir_builder *b, nir_ssa_def *vec, nir_ssa_def *c)
706
{
707
nir_src c_src = nir_src_for_ssa(c);
708
if (nir_src_is_const(c_src)) {
709
uint64_t c_const = nir_src_as_uint(c_src);
710
if (c_const < vec->num_components)
711
return nir_channel(b, vec, c_const);
712
else
713
return nir_ssa_undef(b, 1, vec->bit_size);
714
} else {
715
nir_ssa_def *comps[NIR_MAX_VEC_COMPONENTS];
716
for (unsigned i = 0; i < vec->num_components; i++)
717
comps[i] = nir_channel(b, vec, i);
718
return nir_select_from_ssa_def_array(b, comps, vec->num_components, c);
719
}
720
}
721
722
/** Replaces the component of `vec` specified by `c` with `scalar` */
723
static inline nir_ssa_def *
724
nir_vector_insert_imm(nir_builder *b, nir_ssa_def *vec,
725
nir_ssa_def *scalar, unsigned c)
726
{
727
assert(scalar->num_components == 1);
728
assert(c < vec->num_components);
729
730
nir_op vec_op = nir_op_vec(vec->num_components);
731
nir_alu_instr *vec_instr = nir_alu_instr_create(b->shader, vec_op);
732
733
for (unsigned i = 0; i < vec->num_components; i++) {
734
if (i == c) {
735
vec_instr->src[i].src = nir_src_for_ssa(scalar);
736
vec_instr->src[i].swizzle[0] = 0;
737
} else {
738
vec_instr->src[i].src = nir_src_for_ssa(vec);
739
vec_instr->src[i].swizzle[0] = i;
740
}
741
}
742
743
return nir_builder_alu_instr_finish_and_insert(b, vec_instr);
744
}
745
746
/** Replaces the component of `vec` specified by `c` with `scalar` */
747
static inline nir_ssa_def *
748
nir_vector_insert(nir_builder *b, nir_ssa_def *vec, nir_ssa_def *scalar,
749
nir_ssa_def *c)
750
{
751
assert(scalar->num_components == 1);
752
assert(c->num_components == 1);
753
754
nir_src c_src = nir_src_for_ssa(c);
755
if (nir_src_is_const(c_src)) {
756
uint64_t c_const = nir_src_as_uint(c_src);
757
if (c_const < vec->num_components)
758
return nir_vector_insert_imm(b, vec, scalar, c_const);
759
else
760
return vec;
761
} else {
762
nir_const_value per_comp_idx_const[NIR_MAX_VEC_COMPONENTS];
763
for (unsigned i = 0; i < NIR_MAX_VEC_COMPONENTS; i++)
764
per_comp_idx_const[i] = nir_const_value_for_int(i, c->bit_size);
765
nir_ssa_def *per_comp_idx =
766
nir_build_imm(b, vec->num_components,
767
c->bit_size, per_comp_idx_const);
768
769
/* nir_builder will automatically splat out scalars to vectors so an
770
* insert is as simple as "if I'm the channel, replace me with the
771
* scalar."
772
*/
773
return nir_bcsel(b, nir_ieq(b, c, per_comp_idx), scalar, vec);
774
}
775
}
776
777
static inline nir_ssa_def *
778
nir_i2i(nir_builder *build, nir_ssa_def *x, unsigned dest_bit_size)
779
{
780
if (x->bit_size == dest_bit_size)
781
return x;
782
783
switch (dest_bit_size) {
784
case 64: return nir_i2i64(build, x);
785
case 32: return nir_i2i32(build, x);
786
case 16: return nir_i2i16(build, x);
787
case 8: return nir_i2i8(build, x);
788
default: unreachable("Invalid bit size");
789
}
790
}
791
792
static inline nir_ssa_def *
793
nir_u2u(nir_builder *build, nir_ssa_def *x, unsigned dest_bit_size)
794
{
795
if (x->bit_size == dest_bit_size)
796
return x;
797
798
switch (dest_bit_size) {
799
case 64: return nir_u2u64(build, x);
800
case 32: return nir_u2u32(build, x);
801
case 16: return nir_u2u16(build, x);
802
case 8: return nir_u2u8(build, x);
803
default: unreachable("Invalid bit size");
804
}
805
}
806
807
static inline nir_ssa_def *
808
nir_iadd_imm(nir_builder *build, nir_ssa_def *x, uint64_t y)
809
{
810
assert(x->bit_size <= 64);
811
y &= BITFIELD64_MASK(x->bit_size);
812
813
if (y == 0) {
814
return x;
815
} else {
816
return nir_iadd(build, x, nir_imm_intN_t(build, y, x->bit_size));
817
}
818
}
819
820
static inline nir_ssa_def *
821
nir_iadd_imm_nuw(nir_builder *b, nir_ssa_def *x, uint64_t y)
822
{
823
nir_ssa_def *d = nir_iadd_imm(b, x, y);
824
if (d != x && d->parent_instr->type == nir_instr_type_alu)
825
nir_instr_as_alu(d->parent_instr)->no_unsigned_wrap = true;
826
return d;
827
}
828
829
static inline nir_ssa_def *
830
nir_iadd_nuw(nir_builder *b, nir_ssa_def *x, nir_ssa_def *y)
831
{
832
nir_ssa_def *d = nir_iadd(b, x, y);
833
nir_instr_as_alu(d->parent_instr)->no_unsigned_wrap = true;
834
return d;
835
}
836
837
static inline nir_ssa_def *
838
nir_ieq_imm(nir_builder *build, nir_ssa_def *x, uint64_t y)
839
{
840
return nir_ieq(build, x, nir_imm_intN_t(build, y, x->bit_size));
841
}
842
843
/* Use nir_iadd(x, -y) for reversing parameter ordering */
844
static inline nir_ssa_def *
845
nir_isub_imm(nir_builder *build, uint64_t y, nir_ssa_def *x)
846
{
847
return nir_isub(build, nir_imm_intN_t(build, y, x->bit_size), x);
848
}
849
850
static inline nir_ssa_def *
851
_nir_mul_imm(nir_builder *build, nir_ssa_def *x, uint64_t y, bool amul)
852
{
853
assert(x->bit_size <= 64);
854
y &= BITFIELD64_MASK(x->bit_size);
855
856
if (y == 0) {
857
return nir_imm_intN_t(build, 0, x->bit_size);
858
} else if (y == 1) {
859
return x;
860
} else if (!build->shader->options->lower_bitops &&
861
util_is_power_of_two_or_zero64(y)) {
862
return nir_ishl(build, x, nir_imm_int(build, ffsll(y) - 1));
863
} else if (amul) {
864
return nir_amul(build, x, nir_imm_intN_t(build, y, x->bit_size));
865
} else {
866
return nir_imul(build, x, nir_imm_intN_t(build, y, x->bit_size));
867
}
868
}
869
870
static inline nir_ssa_def *
871
nir_imul_imm(nir_builder *build, nir_ssa_def *x, uint64_t y)
872
{
873
return _nir_mul_imm(build, x, y, false);
874
}
875
876
static inline nir_ssa_def *
877
nir_amul_imm(nir_builder *build, nir_ssa_def *x, uint64_t y)
878
{
879
return _nir_mul_imm(build, x, y, true);
880
}
881
882
static inline nir_ssa_def *
883
nir_fadd_imm(nir_builder *build, nir_ssa_def *x, double y)
884
{
885
return nir_fadd(build, x, nir_imm_floatN_t(build, y, x->bit_size));
886
}
887
888
static inline nir_ssa_def *
889
nir_fmul_imm(nir_builder *build, nir_ssa_def *x, double y)
890
{
891
return nir_fmul(build, x, nir_imm_floatN_t(build, y, x->bit_size));
892
}
893
894
static inline nir_ssa_def *
895
nir_iand_imm(nir_builder *build, nir_ssa_def *x, uint64_t y)
896
{
897
assert(x->bit_size <= 64);
898
y &= BITFIELD64_MASK(x->bit_size);
899
900
if (y == 0) {
901
return nir_imm_intN_t(build, 0, x->bit_size);
902
} else if (y == BITFIELD64_MASK(x->bit_size)) {
903
return x;
904
} else {
905
return nir_iand(build, x, nir_imm_intN_t(build, y, x->bit_size));
906
}
907
}
908
909
static inline nir_ssa_def *
910
nir_ishr_imm(nir_builder *build, nir_ssa_def *x, uint32_t y)
911
{
912
if (y == 0) {
913
return x;
914
} else {
915
return nir_ishr(build, x, nir_imm_int(build, y));
916
}
917
}
918
919
static inline nir_ssa_def *
920
nir_ushr_imm(nir_builder *build, nir_ssa_def *x, uint32_t y)
921
{
922
if (y == 0) {
923
return x;
924
} else {
925
return nir_ushr(build, x, nir_imm_int(build, y));
926
}
927
}
928
929
static inline nir_ssa_def *
930
nir_udiv_imm(nir_builder *build, nir_ssa_def *x, uint64_t y)
931
{
932
assert(x->bit_size <= 64);
933
y &= BITFIELD64_MASK(x->bit_size);
934
935
if (y == 1) {
936
return x;
937
} else if (util_is_power_of_two_nonzero(y)) {
938
return nir_ushr_imm(build, x, ffsll(y) - 1);
939
} else {
940
return nir_udiv(build, x, nir_imm_intN_t(build, y, x->bit_size));
941
}
942
}
943
944
static inline nir_ssa_def *
945
nir_fclamp(nir_builder *b,
946
nir_ssa_def *x, nir_ssa_def *min_val, nir_ssa_def *max_val)
947
{
948
return nir_fmin(b, nir_fmax(b, x, min_val), max_val);
949
}
950
951
static inline nir_ssa_def *
952
nir_iclamp(nir_builder *b,
953
nir_ssa_def *x, nir_ssa_def *min_val, nir_ssa_def *max_val)
954
{
955
return nir_imin(b, nir_imax(b, x, min_val), max_val);
956
}
957
958
static inline nir_ssa_def *
959
nir_uclamp(nir_builder *b,
960
nir_ssa_def *x, nir_ssa_def *min_val, nir_ssa_def *max_val)
961
{
962
return nir_umin(b, nir_umax(b, x, min_val), max_val);
963
}
964
965
static inline nir_ssa_def *
966
nir_pack_bits(nir_builder *b, nir_ssa_def *src, unsigned dest_bit_size)
967
{
968
assert(src->num_components * src->bit_size == dest_bit_size);
969
970
switch (dest_bit_size) {
971
case 64:
972
switch (src->bit_size) {
973
case 32: return nir_pack_64_2x32(b, src);
974
case 16: return nir_pack_64_4x16(b, src);
975
default: break;
976
}
977
break;
978
979
case 32:
980
if (src->bit_size == 16)
981
return nir_pack_32_2x16(b, src);
982
break;
983
984
default:
985
break;
986
}
987
988
/* If we got here, we have no dedicated unpack opcode. */
989
nir_ssa_def *dest = nir_imm_intN_t(b, 0, dest_bit_size);
990
for (unsigned i = 0; i < src->num_components; i++) {
991
nir_ssa_def *val = nir_u2u(b, nir_channel(b, src, i), dest_bit_size);
992
val = nir_ishl(b, val, nir_imm_int(b, i * src->bit_size));
993
dest = nir_ior(b, dest, val);
994
}
995
return dest;
996
}
997
998
static inline nir_ssa_def *
999
nir_unpack_bits(nir_builder *b, nir_ssa_def *src, unsigned dest_bit_size)
1000
{
1001
assert(src->num_components == 1);
1002
assert(src->bit_size > dest_bit_size);
1003
const unsigned dest_num_components = src->bit_size / dest_bit_size;
1004
assert(dest_num_components <= NIR_MAX_VEC_COMPONENTS);
1005
1006
switch (src->bit_size) {
1007
case 64:
1008
switch (dest_bit_size) {
1009
case 32: return nir_unpack_64_2x32(b, src);
1010
case 16: return nir_unpack_64_4x16(b, src);
1011
default: break;
1012
}
1013
break;
1014
1015
case 32:
1016
if (dest_bit_size == 16)
1017
return nir_unpack_32_2x16(b, src);
1018
break;
1019
1020
default:
1021
break;
1022
}
1023
1024
/* If we got here, we have no dedicated unpack opcode. */
1025
nir_ssa_def *dest_comps[NIR_MAX_VEC_COMPONENTS];
1026
for (unsigned i = 0; i < dest_num_components; i++) {
1027
nir_ssa_def *val = nir_ushr_imm(b, src, i * dest_bit_size);
1028
dest_comps[i] = nir_u2u(b, val, dest_bit_size);
1029
}
1030
return nir_vec(b, dest_comps, dest_num_components);
1031
}
1032
1033
/**
1034
* Treats srcs as if it's one big blob of bits and extracts the range of bits
1035
* given by
1036
*
1037
* [first_bit, first_bit + dest_num_components * dest_bit_size)
1038
*
1039
* The range can have any alignment or size as long as it's an integer number
1040
* of destination components and fits inside the concatenated sources.
1041
*
1042
* TODO: The one caveat here is that we can't handle byte alignment if 64-bit
1043
* values are involved because that would require pack/unpack to/from a vec8
1044
* which NIR currently does not support.
1045
*/
1046
static inline nir_ssa_def *
1047
nir_extract_bits(nir_builder *b, nir_ssa_def **srcs, unsigned num_srcs,
1048
unsigned first_bit,
1049
unsigned dest_num_components, unsigned dest_bit_size)
1050
{
1051
const unsigned num_bits = dest_num_components * dest_bit_size;
1052
1053
/* Figure out the common bit size */
1054
unsigned common_bit_size = dest_bit_size;
1055
for (unsigned i = 0; i < num_srcs; i++)
1056
common_bit_size = MIN2(common_bit_size, srcs[i]->bit_size);
1057
if (first_bit > 0)
1058
common_bit_size = MIN2(common_bit_size, (1u << (ffs(first_bit) - 1)));
1059
1060
/* We don't want to have to deal with 1-bit values */
1061
assert(common_bit_size >= 8);
1062
1063
nir_ssa_def *common_comps[NIR_MAX_VEC_COMPONENTS * sizeof(uint64_t)];
1064
assert(num_bits / common_bit_size <= ARRAY_SIZE(common_comps));
1065
1066
/* First, unpack to the common bit size and select the components from the
1067
* source.
1068
*/
1069
int src_idx = -1;
1070
unsigned src_start_bit = 0;
1071
unsigned src_end_bit = 0;
1072
for (unsigned i = 0; i < num_bits / common_bit_size; i++) {
1073
const unsigned bit = first_bit + (i * common_bit_size);
1074
while (bit >= src_end_bit) {
1075
src_idx++;
1076
assert(src_idx < (int) num_srcs);
1077
src_start_bit = src_end_bit;
1078
src_end_bit += srcs[src_idx]->bit_size *
1079
srcs[src_idx]->num_components;
1080
}
1081
assert(bit >= src_start_bit);
1082
assert(bit + common_bit_size <= src_end_bit);
1083
const unsigned rel_bit = bit - src_start_bit;
1084
const unsigned src_bit_size = srcs[src_idx]->bit_size;
1085
1086
nir_ssa_def *comp = nir_channel(b, srcs[src_idx],
1087
rel_bit / src_bit_size);
1088
if (srcs[src_idx]->bit_size > common_bit_size) {
1089
nir_ssa_def *unpacked = nir_unpack_bits(b, comp, common_bit_size);
1090
comp = nir_channel(b, unpacked, (rel_bit % src_bit_size) /
1091
common_bit_size);
1092
}
1093
common_comps[i] = comp;
1094
}
1095
1096
/* Now, re-pack the destination if we have to */
1097
if (dest_bit_size > common_bit_size) {
1098
unsigned common_per_dest = dest_bit_size / common_bit_size;
1099
nir_ssa_def *dest_comps[NIR_MAX_VEC_COMPONENTS];
1100
for (unsigned i = 0; i < dest_num_components; i++) {
1101
nir_ssa_def *unpacked = nir_vec(b, common_comps + i * common_per_dest,
1102
common_per_dest);
1103
dest_comps[i] = nir_pack_bits(b, unpacked, dest_bit_size);
1104
}
1105
return nir_vec(b, dest_comps, dest_num_components);
1106
} else {
1107
assert(dest_bit_size == common_bit_size);
1108
return nir_vec(b, common_comps, dest_num_components);
1109
}
1110
}
1111
1112
static inline nir_ssa_def *
1113
nir_bitcast_vector(nir_builder *b, nir_ssa_def *src, unsigned dest_bit_size)
1114
{
1115
assert((src->bit_size * src->num_components) % dest_bit_size == 0);
1116
const unsigned dest_num_components =
1117
(src->bit_size * src->num_components) / dest_bit_size;
1118
assert(dest_num_components <= NIR_MAX_VEC_COMPONENTS);
1119
1120
return nir_extract_bits(b, &src, 1, 0, dest_num_components, dest_bit_size);
1121
}
1122
1123
/**
1124
* Pad a value to N components with undefs of matching bit size.
1125
* If the value already contains >= num_components, it is returned without change.
1126
*/
1127
static inline nir_ssa_def *
1128
nir_pad_vector(nir_builder *b, nir_ssa_def *src, unsigned num_components)
1129
{
1130
assert(src->num_components <= num_components);
1131
if (src->num_components == num_components)
1132
return src;
1133
1134
nir_ssa_def *components[NIR_MAX_VEC_COMPONENTS];
1135
nir_ssa_def *undef = nir_ssa_undef(b, 1, src->bit_size);
1136
unsigned i = 0;
1137
for (; i < src->num_components; i++)
1138
components[i] = nir_channel(b, src, i);
1139
for (; i < num_components; i++)
1140
components[i] = undef;
1141
1142
return nir_vec(b, components, num_components);
1143
}
1144
1145
/**
1146
* Pad a value to N components with copies of the given immediate of matching
1147
* bit size. If the value already contains >= num_components, it is returned
1148
* without change.
1149
*/
1150
static inline nir_ssa_def *
1151
nir_pad_vector_imm_int(nir_builder *b, nir_ssa_def *src, uint64_t imm_val,
1152
unsigned num_components)
1153
{
1154
assert(src->num_components <= num_components);
1155
if (src->num_components == num_components)
1156
return src;
1157
1158
nir_ssa_def *components[NIR_MAX_VEC_COMPONENTS];
1159
nir_ssa_def *imm = nir_imm_intN_t(b, imm_val, src->bit_size);
1160
unsigned i = 0;
1161
for (; i < src->num_components; i++)
1162
components[i] = nir_channel(b, src, i);
1163
for (; i < num_components; i++)
1164
components[i] = imm;
1165
1166
return nir_vec(b, components, num_components);
1167
}
1168
1169
/**
1170
* Pad a value to 4 components with undefs of matching bit size.
1171
* If the value already contains >= 4 components, it is returned without change.
1172
*/
1173
static inline nir_ssa_def *
1174
nir_pad_vec4(nir_builder *b, nir_ssa_def *src)
1175
{
1176
return nir_pad_vector(b, src, 4);
1177
}
1178
1179
/**
1180
* Turns a nir_src into a nir_ssa_def * so it can be passed to
1181
* nir_build_alu()-based builder calls.
1182
*
1183
* See nir_ssa_for_alu_src() for alu instructions.
1184
*/
1185
static inline nir_ssa_def *
1186
nir_ssa_for_src(nir_builder *build, nir_src src, int num_components)
1187
{
1188
if (src.is_ssa && src.ssa->num_components == num_components)
1189
return src.ssa;
1190
1191
nir_alu_src alu = { NIR_SRC_INIT };
1192
alu.src = src;
1193
for (int j = 0; j < NIR_MAX_VEC_COMPONENTS; j++)
1194
alu.swizzle[j] = j;
1195
1196
return nir_mov_alu(build, alu, num_components);
1197
}
1198
1199
/**
1200
* Similar to nir_ssa_for_src(), but for alu srcs, respecting the
1201
* nir_alu_src's swizzle.
1202
*/
1203
static inline nir_ssa_def *
1204
nir_ssa_for_alu_src(nir_builder *build, nir_alu_instr *instr, unsigned srcn)
1205
{
1206
if (nir_alu_src_is_trivial_ssa(instr, srcn))
1207
return instr->src[srcn].src.ssa;
1208
1209
nir_alu_src *src = &instr->src[srcn];
1210
unsigned num_components = nir_ssa_alu_instr_src_components(instr, srcn);
1211
return nir_mov_alu(build, *src, num_components);
1212
}
1213
1214
static inline unsigned
1215
nir_get_ptr_bitsize(nir_shader *shader)
1216
{
1217
if (shader->info.stage == MESA_SHADER_KERNEL)
1218
return shader->info.cs.ptr_size;
1219
return 32;
1220
}
1221
1222
static inline nir_deref_instr *
1223
nir_build_deref_var(nir_builder *build, nir_variable *var)
1224
{
1225
nir_deref_instr *deref =
1226
nir_deref_instr_create(build->shader, nir_deref_type_var);
1227
1228
deref->modes = (nir_variable_mode)var->data.mode;
1229
deref->type = var->type;
1230
deref->var = var;
1231
1232
nir_ssa_dest_init(&deref->instr, &deref->dest, 1,
1233
nir_get_ptr_bitsize(build->shader), NULL);
1234
1235
nir_builder_instr_insert(build, &deref->instr);
1236
1237
return deref;
1238
}
1239
1240
static inline nir_deref_instr *
1241
nir_build_deref_array(nir_builder *build, nir_deref_instr *parent,
1242
nir_ssa_def *index)
1243
{
1244
assert(glsl_type_is_array(parent->type) ||
1245
glsl_type_is_matrix(parent->type) ||
1246
glsl_type_is_vector(parent->type));
1247
1248
assert(index->bit_size == parent->dest.ssa.bit_size);
1249
1250
nir_deref_instr *deref =
1251
nir_deref_instr_create(build->shader, nir_deref_type_array);
1252
1253
deref->modes = parent->modes;
1254
deref->type = glsl_get_array_element(parent->type);
1255
deref->parent = nir_src_for_ssa(&parent->dest.ssa);
1256
deref->arr.index = nir_src_for_ssa(index);
1257
1258
nir_ssa_dest_init(&deref->instr, &deref->dest,
1259
parent->dest.ssa.num_components,
1260
parent->dest.ssa.bit_size, NULL);
1261
1262
nir_builder_instr_insert(build, &deref->instr);
1263
1264
return deref;
1265
}
1266
1267
static inline nir_deref_instr *
1268
nir_build_deref_array_imm(nir_builder *build, nir_deref_instr *parent,
1269
int64_t index)
1270
{
1271
assert(parent->dest.is_ssa);
1272
nir_ssa_def *idx_ssa = nir_imm_intN_t(build, index,
1273
parent->dest.ssa.bit_size);
1274
1275
return nir_build_deref_array(build, parent, idx_ssa);
1276
}
1277
1278
static inline nir_deref_instr *
1279
nir_build_deref_ptr_as_array(nir_builder *build, nir_deref_instr *parent,
1280
nir_ssa_def *index)
1281
{
1282
assert(parent->deref_type == nir_deref_type_array ||
1283
parent->deref_type == nir_deref_type_ptr_as_array ||
1284
parent->deref_type == nir_deref_type_cast);
1285
1286
assert(index->bit_size == parent->dest.ssa.bit_size);
1287
1288
nir_deref_instr *deref =
1289
nir_deref_instr_create(build->shader, nir_deref_type_ptr_as_array);
1290
1291
deref->modes = parent->modes;
1292
deref->type = parent->type;
1293
deref->parent = nir_src_for_ssa(&parent->dest.ssa);
1294
deref->arr.index = nir_src_for_ssa(index);
1295
1296
nir_ssa_dest_init(&deref->instr, &deref->dest,
1297
parent->dest.ssa.num_components,
1298
parent->dest.ssa.bit_size, NULL);
1299
1300
nir_builder_instr_insert(build, &deref->instr);
1301
1302
return deref;
1303
}
1304
1305
static inline nir_deref_instr *
1306
nir_build_deref_array_wildcard(nir_builder *build, nir_deref_instr *parent)
1307
{
1308
assert(glsl_type_is_array(parent->type) ||
1309
glsl_type_is_matrix(parent->type));
1310
1311
nir_deref_instr *deref =
1312
nir_deref_instr_create(build->shader, nir_deref_type_array_wildcard);
1313
1314
deref->modes = parent->modes;
1315
deref->type = glsl_get_array_element(parent->type);
1316
deref->parent = nir_src_for_ssa(&parent->dest.ssa);
1317
1318
nir_ssa_dest_init(&deref->instr, &deref->dest,
1319
parent->dest.ssa.num_components,
1320
parent->dest.ssa.bit_size, NULL);
1321
1322
nir_builder_instr_insert(build, &deref->instr);
1323
1324
return deref;
1325
}
1326
1327
static inline nir_deref_instr *
1328
nir_build_deref_struct(nir_builder *build, nir_deref_instr *parent,
1329
unsigned index)
1330
{
1331
assert(glsl_type_is_struct_or_ifc(parent->type));
1332
1333
nir_deref_instr *deref =
1334
nir_deref_instr_create(build->shader, nir_deref_type_struct);
1335
1336
deref->modes = parent->modes;
1337
deref->type = glsl_get_struct_field(parent->type, index);
1338
deref->parent = nir_src_for_ssa(&parent->dest.ssa);
1339
deref->strct.index = index;
1340
1341
nir_ssa_dest_init(&deref->instr, &deref->dest,
1342
parent->dest.ssa.num_components,
1343
parent->dest.ssa.bit_size, NULL);
1344
1345
nir_builder_instr_insert(build, &deref->instr);
1346
1347
return deref;
1348
}
1349
1350
static inline nir_deref_instr *
1351
nir_build_deref_cast(nir_builder *build, nir_ssa_def *parent,
1352
nir_variable_mode modes, const struct glsl_type *type,
1353
unsigned ptr_stride)
1354
{
1355
nir_deref_instr *deref =
1356
nir_deref_instr_create(build->shader, nir_deref_type_cast);
1357
1358
deref->modes = modes;
1359
deref->type = type;
1360
deref->parent = nir_src_for_ssa(parent);
1361
deref->cast.ptr_stride = ptr_stride;
1362
1363
nir_ssa_dest_init(&deref->instr, &deref->dest,
1364
parent->num_components, parent->bit_size, NULL);
1365
1366
nir_builder_instr_insert(build, &deref->instr);
1367
1368
return deref;
1369
}
1370
1371
static inline nir_deref_instr *
1372
nir_alignment_deref_cast(nir_builder *build, nir_deref_instr *parent,
1373
uint32_t align_mul, uint32_t align_offset)
1374
{
1375
nir_deref_instr *deref =
1376
nir_deref_instr_create(build->shader, nir_deref_type_cast);
1377
1378
deref->modes = parent->modes;
1379
deref->type = parent->type;
1380
deref->parent = nir_src_for_ssa(&parent->dest.ssa);
1381
deref->cast.ptr_stride = nir_deref_instr_array_stride(deref);
1382
deref->cast.align_mul = align_mul;
1383
deref->cast.align_offset = align_offset;
1384
1385
nir_ssa_dest_init(&deref->instr, &deref->dest,
1386
parent->dest.ssa.num_components,
1387
parent->dest.ssa.bit_size, NULL);
1388
1389
nir_builder_instr_insert(build, &deref->instr);
1390
1391
return deref;
1392
}
1393
1394
/** Returns a deref that follows another but starting from the given parent
1395
*
1396
* The new deref will be the same type and take the same array or struct index
1397
* as the leader deref but it may have a different parent. This is very
1398
* useful for walking deref paths.
1399
*/
1400
static inline nir_deref_instr *
1401
nir_build_deref_follower(nir_builder *b, nir_deref_instr *parent,
1402
nir_deref_instr *leader)
1403
{
1404
/* If the derefs would have the same parent, don't make a new one */
1405
assert(leader->parent.is_ssa);
1406
if (leader->parent.ssa == &parent->dest.ssa)
1407
return leader;
1408
1409
UNUSED nir_deref_instr *leader_parent = nir_src_as_deref(leader->parent);
1410
1411
switch (leader->deref_type) {
1412
case nir_deref_type_var:
1413
unreachable("A var dereference cannot have a parent");
1414
break;
1415
1416
case nir_deref_type_array:
1417
case nir_deref_type_array_wildcard:
1418
assert(glsl_type_is_matrix(parent->type) ||
1419
glsl_type_is_array(parent->type) ||
1420
(leader->deref_type == nir_deref_type_array &&
1421
glsl_type_is_vector(parent->type)));
1422
assert(glsl_get_length(parent->type) ==
1423
glsl_get_length(leader_parent->type));
1424
1425
if (leader->deref_type == nir_deref_type_array) {
1426
assert(leader->arr.index.is_ssa);
1427
nir_ssa_def *index = nir_i2i(b, leader->arr.index.ssa,
1428
parent->dest.ssa.bit_size);
1429
return nir_build_deref_array(b, parent, index);
1430
} else {
1431
return nir_build_deref_array_wildcard(b, parent);
1432
}
1433
1434
case nir_deref_type_struct:
1435
assert(glsl_type_is_struct_or_ifc(parent->type));
1436
assert(glsl_get_length(parent->type) ==
1437
glsl_get_length(leader_parent->type));
1438
1439
return nir_build_deref_struct(b, parent, leader->strct.index);
1440
1441
default:
1442
unreachable("Invalid deref instruction type");
1443
}
1444
}
1445
1446
static inline nir_ssa_def *
1447
nir_load_reg(nir_builder *build, nir_register *reg)
1448
{
1449
return nir_ssa_for_src(build, nir_src_for_reg(reg), reg->num_components);
1450
}
1451
1452
static inline void
1453
nir_store_reg(nir_builder *build, nir_register *reg,
1454
nir_ssa_def *def, nir_component_mask_t write_mask)
1455
{
1456
assert(reg->num_components == def->num_components);
1457
assert(reg->bit_size == def->bit_size);
1458
1459
nir_alu_instr *mov = nir_alu_instr_create(build->shader, nir_op_mov);
1460
mov->src[0].src = nir_src_for_ssa(def);
1461
mov->dest.dest = nir_dest_for_reg(reg);
1462
mov->dest.write_mask = write_mask & BITFIELD_MASK(reg->num_components);
1463
nir_builder_instr_insert(build, &mov->instr);
1464
}
1465
1466
static inline nir_ssa_def *
1467
nir_load_deref_with_access(nir_builder *build, nir_deref_instr *deref,
1468
enum gl_access_qualifier access)
1469
{
1470
return nir_build_load_deref(build, glsl_get_vector_elements(deref->type),
1471
glsl_get_bit_size(deref->type), &deref->dest.ssa,
1472
access);
1473
}
1474
1475
#undef nir_load_deref
1476
static inline nir_ssa_def *
1477
nir_load_deref(nir_builder *build, nir_deref_instr *deref)
1478
{
1479
return nir_load_deref_with_access(build, deref, (enum gl_access_qualifier)0);
1480
}
1481
1482
static inline void
1483
nir_store_deref_with_access(nir_builder *build, nir_deref_instr *deref,
1484
nir_ssa_def *value, unsigned writemask,
1485
enum gl_access_qualifier access)
1486
{
1487
writemask &= (1u << value->num_components) - 1u;
1488
nir_build_store_deref(build, &deref->dest.ssa, value, writemask, access);
1489
}
1490
1491
#undef nir_store_deref
1492
static inline void
1493
nir_store_deref(nir_builder *build, nir_deref_instr *deref,
1494
nir_ssa_def *value, unsigned writemask)
1495
{
1496
nir_store_deref_with_access(build, deref, value, writemask,
1497
(enum gl_access_qualifier)0);
1498
}
1499
1500
static inline void
1501
nir_copy_deref_with_access(nir_builder *build, nir_deref_instr *dest,
1502
nir_deref_instr *src,
1503
enum gl_access_qualifier dest_access,
1504
enum gl_access_qualifier src_access)
1505
{
1506
nir_build_copy_deref(build, &dest->dest.ssa, &src->dest.ssa, dest_access, src_access);
1507
}
1508
1509
#undef nir_copy_deref
1510
static inline void
1511
nir_copy_deref(nir_builder *build, nir_deref_instr *dest, nir_deref_instr *src)
1512
{
1513
nir_copy_deref_with_access(build, dest, src,
1514
(enum gl_access_qualifier) 0,
1515
(enum gl_access_qualifier) 0);
1516
}
1517
1518
static inline void
1519
nir_memcpy_deref_with_access(nir_builder *build, nir_deref_instr *dest,
1520
nir_deref_instr *src, nir_ssa_def *size,
1521
enum gl_access_qualifier dest_access,
1522
enum gl_access_qualifier src_access)
1523
{
1524
nir_build_memcpy_deref(build, &dest->dest.ssa, &src->dest.ssa,
1525
size, dest_access, src_access);
1526
}
1527
1528
#undef nir_memcpy_deref
1529
static inline void
1530
nir_memcpy_deref(nir_builder *build, nir_deref_instr *dest,
1531
nir_deref_instr *src, nir_ssa_def *size)
1532
{
1533
nir_memcpy_deref_with_access(build, dest, src, size,
1534
(enum gl_access_qualifier)0,
1535
(enum gl_access_qualifier)0);
1536
}
1537
1538
static inline nir_ssa_def *
1539
nir_load_var(nir_builder *build, nir_variable *var)
1540
{
1541
return nir_load_deref(build, nir_build_deref_var(build, var));
1542
}
1543
1544
static inline void
1545
nir_store_var(nir_builder *build, nir_variable *var, nir_ssa_def *value,
1546
unsigned writemask)
1547
{
1548
nir_store_deref(build, nir_build_deref_var(build, var), value, writemask);
1549
}
1550
1551
static inline void
1552
nir_copy_var(nir_builder *build, nir_variable *dest, nir_variable *src)
1553
{
1554
nir_copy_deref(build, nir_build_deref_var(build, dest),
1555
nir_build_deref_var(build, src));
1556
}
1557
1558
#undef nir_load_global
1559
static inline nir_ssa_def *
1560
nir_load_global(nir_builder *build, nir_ssa_def *addr, unsigned align,
1561
unsigned num_components, unsigned bit_size)
1562
{
1563
nir_intrinsic_instr *load =
1564
nir_intrinsic_instr_create(build->shader, nir_intrinsic_load_global);
1565
load->num_components = num_components;
1566
load->src[0] = nir_src_for_ssa(addr);
1567
nir_intrinsic_set_align(load, align, 0);
1568
nir_ssa_dest_init(&load->instr, &load->dest,
1569
num_components, bit_size, NULL);
1570
nir_builder_instr_insert(build, &load->instr);
1571
return &load->dest.ssa;
1572
}
1573
1574
#undef nir_store_global
1575
static inline void
1576
nir_store_global(nir_builder *build, nir_ssa_def *addr, unsigned align,
1577
nir_ssa_def *value, nir_component_mask_t write_mask)
1578
{
1579
nir_intrinsic_instr *store =
1580
nir_intrinsic_instr_create(build->shader, nir_intrinsic_store_global);
1581
store->num_components = value->num_components;
1582
store->src[0] = nir_src_for_ssa(value);
1583
store->src[1] = nir_src_for_ssa(addr);
1584
nir_intrinsic_set_write_mask(store,
1585
write_mask & BITFIELD_MASK(value->num_components));
1586
nir_intrinsic_set_align(store, align, 0);
1587
nir_builder_instr_insert(build, &store->instr);
1588
}
1589
1590
#undef nir_load_global_constant
1591
static inline nir_ssa_def *
1592
nir_load_global_constant(nir_builder *build, nir_ssa_def *addr, unsigned align,
1593
unsigned num_components, unsigned bit_size)
1594
{
1595
nir_intrinsic_instr *load =
1596
nir_intrinsic_instr_create(build->shader, nir_intrinsic_load_global_constant);
1597
load->num_components = num_components;
1598
load->src[0] = nir_src_for_ssa(addr);
1599
nir_intrinsic_set_align(load, align, 0);
1600
nir_ssa_dest_init(&load->instr, &load->dest,
1601
num_components, bit_size, NULL);
1602
nir_builder_instr_insert(build, &load->instr);
1603
return &load->dest.ssa;
1604
}
1605
1606
#undef nir_load_param
1607
static inline nir_ssa_def *
1608
nir_load_param(nir_builder *build, uint32_t param_idx)
1609
{
1610
assert(param_idx < build->impl->function->num_params);
1611
nir_parameter *param = &build->impl->function->params[param_idx];
1612
return nir_build_load_param(build, param->num_components, param->bit_size, param_idx);
1613
}
1614
1615
/**
1616
* This function takes an I/O intrinsic like load/store_input,
1617
* and emits a sequence that calculates the full offset of that instruction,
1618
* including a stride to the base and component offsets.
1619
*/
1620
static inline nir_ssa_def *
1621
nir_build_calc_io_offset(nir_builder *b,
1622
nir_intrinsic_instr *intrin,
1623
nir_ssa_def *base_stride,
1624
unsigned component_stride)
1625
{
1626
/* base is the driver_location, which is in slots (1 slot = 4x4 bytes) */
1627
nir_ssa_def *base_op = nir_imul_imm(b, base_stride, nir_intrinsic_base(intrin));
1628
1629
/* offset should be interpreted in relation to the base,
1630
* so the instruction effectively reads/writes another input/output
1631
* when it has an offset
1632
*/
1633
nir_ssa_def *offset_op = nir_imul(b, base_stride, nir_ssa_for_src(b, *nir_get_io_offset_src(intrin), 1));
1634
1635
/* component is in bytes */
1636
unsigned const_op = nir_intrinsic_component(intrin) * component_stride;
1637
1638
return nir_iadd_imm_nuw(b, nir_iadd_nuw(b, base_op, offset_op), const_op);
1639
}
1640
1641
/* calculate a `(1 << value) - 1` in ssa without overflows */
1642
static inline nir_ssa_def *
1643
nir_mask(nir_builder *b, nir_ssa_def *bits, unsigned dst_bit_size)
1644
{
1645
return nir_ushr(b, nir_imm_intN_t(b, -1, dst_bit_size),
1646
nir_isub_imm(b, dst_bit_size, nir_u2u32(b, bits)));
1647
}
1648
1649
static inline nir_ssa_def *
1650
nir_f2b(nir_builder *build, nir_ssa_def *f)
1651
{
1652
return nir_f2b1(build, f);
1653
}
1654
1655
static inline nir_ssa_def *
1656
nir_i2b(nir_builder *build, nir_ssa_def *i)
1657
{
1658
return nir_i2b1(build, i);
1659
}
1660
1661
static inline nir_ssa_def *
1662
nir_b2f(nir_builder *build, nir_ssa_def *b, uint32_t bit_size)
1663
{
1664
switch (bit_size) {
1665
case 64: return nir_b2f64(build, b);
1666
case 32: return nir_b2f32(build, b);
1667
case 16: return nir_b2f16(build, b);
1668
default:
1669
unreachable("Invalid bit-size");
1670
};
1671
}
1672
1673
static inline nir_ssa_def *
1674
nir_b2i(nir_builder *build, nir_ssa_def *b, uint32_t bit_size)
1675
{
1676
switch (bit_size) {
1677
case 64: return nir_b2i64(build, b);
1678
case 32: return nir_b2i32(build, b);
1679
case 16: return nir_b2i16(build, b);
1680
case 8: return nir_b2i8(build, b);
1681
default:
1682
unreachable("Invalid bit-size");
1683
};
1684
}
1685
static inline nir_ssa_def *
1686
nir_load_barycentric(nir_builder *build, nir_intrinsic_op op,
1687
unsigned interp_mode)
1688
{
1689
unsigned num_components = op == nir_intrinsic_load_barycentric_model ? 3 : 2;
1690
nir_intrinsic_instr *bary = nir_intrinsic_instr_create(build->shader, op);
1691
nir_ssa_dest_init(&bary->instr, &bary->dest, num_components, 32, NULL);
1692
nir_intrinsic_set_interp_mode(bary, interp_mode);
1693
nir_builder_instr_insert(build, &bary->instr);
1694
return &bary->dest.ssa;
1695
}
1696
1697
static inline void
1698
nir_jump(nir_builder *build, nir_jump_type jump_type)
1699
{
1700
assert(jump_type != nir_jump_goto && jump_type != nir_jump_goto_if);
1701
nir_jump_instr *jump = nir_jump_instr_create(build->shader, jump_type);
1702
nir_builder_instr_insert(build, &jump->instr);
1703
}
1704
1705
static inline void
1706
nir_goto(nir_builder *build, struct nir_block *target)
1707
{
1708
assert(!build->impl->structured);
1709
nir_jump_instr *jump = nir_jump_instr_create(build->shader, nir_jump_goto);
1710
jump->target = target;
1711
nir_builder_instr_insert(build, &jump->instr);
1712
}
1713
1714
static inline void
1715
nir_goto_if(nir_builder *build, struct nir_block *target, nir_src cond,
1716
struct nir_block *else_target)
1717
{
1718
assert(!build->impl->structured);
1719
nir_jump_instr *jump = nir_jump_instr_create(build->shader, nir_jump_goto_if);
1720
jump->condition = cond;
1721
jump->target = target;
1722
jump->else_target = else_target;
1723
nir_builder_instr_insert(build, &jump->instr);
1724
}
1725
1726
static inline nir_ssa_def *
1727
nir_compare_func(nir_builder *b, enum compare_func func,
1728
nir_ssa_def *src0, nir_ssa_def *src1)
1729
{
1730
switch (func) {
1731
case COMPARE_FUNC_NEVER:
1732
return nir_imm_int(b, 0);
1733
case COMPARE_FUNC_ALWAYS:
1734
return nir_imm_int(b, ~0);
1735
case COMPARE_FUNC_EQUAL:
1736
return nir_feq(b, src0, src1);
1737
case COMPARE_FUNC_NOTEQUAL:
1738
return nir_fneu(b, src0, src1);
1739
case COMPARE_FUNC_GREATER:
1740
return nir_flt(b, src1, src0);
1741
case COMPARE_FUNC_GEQUAL:
1742
return nir_fge(b, src0, src1);
1743
case COMPARE_FUNC_LESS:
1744
return nir_flt(b, src0, src1);
1745
case COMPARE_FUNC_LEQUAL:
1746
return nir_fge(b, src1, src0);
1747
}
1748
unreachable("bad compare func");
1749
}
1750
1751
static inline void
1752
nir_scoped_memory_barrier(nir_builder *b,
1753
nir_scope scope,
1754
nir_memory_semantics semantics,
1755
nir_variable_mode modes)
1756
{
1757
nir_scoped_barrier(b, NIR_SCOPE_NONE, scope, semantics, modes);
1758
}
1759
1760
static inline nir_ssa_def *
1761
nir_type_convert(nir_builder *b,
1762
nir_ssa_def *src,
1763
nir_alu_type src_type,
1764
nir_alu_type dest_type)
1765
{
1766
assert(nir_alu_type_get_type_size(src_type) == 0 ||
1767
nir_alu_type_get_type_size(src_type) == src->bit_size);
1768
1769
src_type = (nir_alu_type) (src_type | src->bit_size);
1770
1771
nir_op opcode =
1772
nir_type_conversion_op(src_type, dest_type, nir_rounding_mode_undef);
1773
1774
return nir_build_alu(b, opcode, src, NULL, NULL, NULL);
1775
}
1776
1777
static inline nir_ssa_def *
1778
nir_convert_to_bit_size(nir_builder *b,
1779
nir_ssa_def *src,
1780
nir_alu_type type,
1781
unsigned bit_size)
1782
{
1783
return nir_type_convert(b, src, type, (nir_alu_type) (type | bit_size));
1784
}
1785
1786
static inline nir_ssa_def *
1787
nir_i2iN(nir_builder *b, nir_ssa_def *src, unsigned bit_size)
1788
{
1789
return nir_convert_to_bit_size(b, src, nir_type_int, bit_size);
1790
}
1791
1792
static inline nir_ssa_def *
1793
nir_u2uN(nir_builder *b, nir_ssa_def *src, unsigned bit_size)
1794
{
1795
return nir_convert_to_bit_size(b, src, nir_type_uint, bit_size);
1796
}
1797
1798
static inline nir_ssa_def *
1799
nir_b2bN(nir_builder *b, nir_ssa_def *src, unsigned bit_size)
1800
{
1801
return nir_convert_to_bit_size(b, src, nir_type_bool, bit_size);
1802
}
1803
1804
static inline nir_ssa_def *
1805
nir_f2fN(nir_builder *b, nir_ssa_def *src, unsigned bit_size)
1806
{
1807
return nir_convert_to_bit_size(b, src, nir_type_float, bit_size);
1808
}
1809
1810
static inline nir_ssa_def *
1811
nir_i2fN(nir_builder *b, nir_ssa_def *src, unsigned bit_size)
1812
{
1813
return nir_type_convert(b, src, nir_type_int,
1814
(nir_alu_type) (nir_type_float | bit_size));
1815
}
1816
1817
static inline nir_ssa_def *
1818
nir_u2fN(nir_builder *b, nir_ssa_def *src, unsigned bit_size)
1819
{
1820
return nir_type_convert(b, src, nir_type_uint,
1821
(nir_alu_type) (nir_type_float | bit_size));
1822
}
1823
1824
static inline nir_ssa_def *
1825
nir_f2uN(nir_builder *b, nir_ssa_def *src, unsigned bit_size)
1826
{
1827
return nir_type_convert(b, src, nir_type_float,
1828
(nir_alu_type) (nir_type_uint | bit_size));
1829
}
1830
1831
static inline nir_ssa_def *
1832
nir_f2iN(nir_builder *b, nir_ssa_def *src, unsigned bit_size)
1833
{
1834
return nir_type_convert(b, src, nir_type_float,
1835
(nir_alu_type) (nir_type_int | bit_size));
1836
}
1837
1838
#endif /* NIR_BUILDER_H */
1839
1840