glsl: Add function support to glsl_to_nir
[mesa.git] / src / compiler / glsl / glsl_to_nir.cpp
1 /*
2 * Copyright © 2014 Intel Corporation
3 *
4 * Permission is hereby granted, free of charge, to any person obtaining a
5 * copy of this software and associated documentation files (the "Software"),
6 * to deal in the Software without restriction, including without limitation
7 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8 * and/or sell copies of the Software, and to permit persons to whom the
9 * Software is furnished to do so, subject to the following conditions:
10 *
11 * The above copyright notice and this permission notice (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 * Authors:
24 * Connor Abbott (cwabbott0@gmail.com)
25 *
26 */
27
28 #include "glsl_to_nir.h"
29 #include "ir_visitor.h"
30 #include "ir_hierarchical_visitor.h"
31 #include "ir.h"
32 #include "compiler/nir/nir_control_flow.h"
33 #include "compiler/nir/nir_builder.h"
34 #include "main/imports.h"
35 #include "main/mtypes.h"
36 #include "util/u_math.h"
37
38 /*
39 * pass to lower GLSL IR to NIR
40 *
41 * This will lower variable dereferences to loads/stores of corresponding
42 * variables in NIR - the variables will be converted to registers in a later
43 * pass.
44 */
45
46 namespace {
47
48 class nir_visitor : public ir_visitor
49 {
50 public:
51 nir_visitor(nir_shader *shader);
52 ~nir_visitor();
53
54 virtual void visit(ir_variable *);
55 virtual void visit(ir_function *);
56 virtual void visit(ir_function_signature *);
57 virtual void visit(ir_loop *);
58 virtual void visit(ir_if *);
59 virtual void visit(ir_discard *);
60 virtual void visit(ir_loop_jump *);
61 virtual void visit(ir_return *);
62 virtual void visit(ir_call *);
63 virtual void visit(ir_assignment *);
64 virtual void visit(ir_emit_vertex *);
65 virtual void visit(ir_end_primitive *);
66 virtual void visit(ir_expression *);
67 virtual void visit(ir_swizzle *);
68 virtual void visit(ir_texture *);
69 virtual void visit(ir_constant *);
70 virtual void visit(ir_dereference_variable *);
71 virtual void visit(ir_dereference_record *);
72 virtual void visit(ir_dereference_array *);
73 virtual void visit(ir_barrier *);
74
75 void create_function(ir_function_signature *ir);
76
77 private:
78 void add_instr(nir_instr *instr, unsigned num_components, unsigned bit_size);
79 nir_ssa_def *evaluate_rvalue(ir_rvalue *ir);
80
81 nir_alu_instr *emit(nir_op op, unsigned dest_size, nir_ssa_def **srcs);
82 nir_alu_instr *emit(nir_op op, unsigned dest_size, nir_ssa_def *src1);
83 nir_alu_instr *emit(nir_op op, unsigned dest_size, nir_ssa_def *src1,
84 nir_ssa_def *src2);
85 nir_alu_instr *emit(nir_op op, unsigned dest_size, nir_ssa_def *src1,
86 nir_ssa_def *src2, nir_ssa_def *src3);
87
88 bool supports_ints;
89
90 nir_shader *shader;
91 nir_function_impl *impl;
92 nir_builder b;
93 nir_ssa_def *result; /* result of the expression tree last visited */
94
95 nir_deref_instr *evaluate_deref(ir_instruction *ir);
96
97 /* most recent deref instruction created */
98 nir_deref_instr *deref;
99
100 /* whether the IR we're operating on is per-function or global */
101 bool is_global;
102
103 ir_function_signature *sig;
104
105 /* map of ir_variable -> nir_variable */
106 struct hash_table *var_table;
107
108 /* map of ir_function_signature -> nir_function_overload */
109 struct hash_table *overload_table;
110 };
111
112 /*
113 * This visitor runs before the main visitor, calling create_function() for
114 * each function so that the main visitor can resolve forward references in
115 * calls.
116 */
117
118 class nir_function_visitor : public ir_hierarchical_visitor
119 {
120 public:
121 nir_function_visitor(nir_visitor *v) : visitor(v)
122 {
123 }
124 virtual ir_visitor_status visit_enter(ir_function *);
125
126 private:
127 nir_visitor *visitor;
128 };
129
130 } /* end of anonymous namespace */
131
132 nir_shader *
133 glsl_to_nir(const struct gl_shader_program *shader_prog,
134 gl_shader_stage stage,
135 const nir_shader_compiler_options *options)
136 {
137 struct gl_linked_shader *sh = shader_prog->_LinkedShaders[stage];
138
139 nir_shader *shader = nir_shader_create(NULL, stage, options,
140 &sh->Program->info);
141
142 nir_visitor v1(shader);
143 nir_function_visitor v2(&v1);
144 v2.run(sh->ir);
145 visit_exec_list(sh->ir, &v1);
146
147 nir_lower_constant_initializers(shader, (nir_variable_mode)~0);
148
149 /* Remap the locations to slots so those requiring two slots will occupy
150 * two locations. For instance, if we have in the IR code a dvec3 attr0 in
151 * location 0 and vec4 attr1 in location 1, in NIR attr0 will use
152 * locations/slots 0 and 1, and attr1 will use location/slot 2 */
153 if (shader->info.stage == MESA_SHADER_VERTEX)
154 nir_remap_dual_slot_attributes(shader, &sh->Program->DualSlotInputs);
155
156 shader->info.name = ralloc_asprintf(shader, "GLSL%d", shader_prog->Name);
157 if (shader_prog->Label)
158 shader->info.label = ralloc_strdup(shader, shader_prog->Label);
159
160 /* Check for transform feedback varyings specified via the API */
161 shader->info.has_transform_feedback_varyings =
162 shader_prog->TransformFeedback.NumVarying > 0;
163
164 /* Check for transform feedback varyings specified in the Shader */
165 if (shader_prog->last_vert_prog)
166 shader->info.has_transform_feedback_varyings |=
167 shader_prog->last_vert_prog->sh.LinkedTransformFeedback->NumVarying > 0;
168
169 return shader;
170 }
171
172 nir_visitor::nir_visitor(nir_shader *shader)
173 {
174 this->supports_ints = shader->options->native_integers;
175 this->shader = shader;
176 this->is_global = true;
177 this->var_table = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
178 _mesa_key_pointer_equal);
179 this->overload_table = _mesa_hash_table_create(NULL, _mesa_hash_pointer,
180 _mesa_key_pointer_equal);
181 this->result = NULL;
182 this->impl = NULL;
183 memset(&this->b, 0, sizeof(this->b));
184 }
185
186 nir_visitor::~nir_visitor()
187 {
188 _mesa_hash_table_destroy(this->var_table, NULL);
189 _mesa_hash_table_destroy(this->overload_table, NULL);
190 }
191
192 nir_deref_instr *
193 nir_visitor::evaluate_deref(ir_instruction *ir)
194 {
195 ir->accept(this);
196 return this->deref;
197 }
198
199 static nir_constant *
200 constant_copy(ir_constant *ir, void *mem_ctx)
201 {
202 if (ir == NULL)
203 return NULL;
204
205 nir_constant *ret = rzalloc(mem_ctx, nir_constant);
206
207 const unsigned rows = ir->type->vector_elements;
208 const unsigned cols = ir->type->matrix_columns;
209 unsigned i;
210
211 ret->num_elements = 0;
212 switch (ir->type->base_type) {
213 case GLSL_TYPE_UINT:
214 /* Only float base types can be matrices. */
215 assert(cols == 1);
216
217 for (unsigned r = 0; r < rows; r++)
218 ret->values[0].u32[r] = ir->value.u[r];
219
220 break;
221
222 case GLSL_TYPE_INT:
223 /* Only float base types can be matrices. */
224 assert(cols == 1);
225
226 for (unsigned r = 0; r < rows; r++)
227 ret->values[0].i32[r] = ir->value.i[r];
228
229 break;
230
231 case GLSL_TYPE_FLOAT:
232 for (unsigned c = 0; c < cols; c++) {
233 for (unsigned r = 0; r < rows; r++)
234 ret->values[c].f32[r] = ir->value.f[c * rows + r];
235 }
236 break;
237
238 case GLSL_TYPE_DOUBLE:
239 for (unsigned c = 0; c < cols; c++) {
240 for (unsigned r = 0; r < rows; r++)
241 ret->values[c].f64[r] = ir->value.d[c * rows + r];
242 }
243 break;
244
245 case GLSL_TYPE_UINT64:
246 /* Only float base types can be matrices. */
247 assert(cols == 1);
248
249 for (unsigned r = 0; r < rows; r++)
250 ret->values[0].u64[r] = ir->value.u64[r];
251 break;
252
253 case GLSL_TYPE_INT64:
254 /* Only float base types can be matrices. */
255 assert(cols == 1);
256
257 for (unsigned r = 0; r < rows; r++)
258 ret->values[0].i64[r] = ir->value.i64[r];
259 break;
260
261 case GLSL_TYPE_BOOL:
262 /* Only float base types can be matrices. */
263 assert(cols == 1);
264
265 for (unsigned r = 0; r < rows; r++)
266 ret->values[0].b[r] = ir->value.b[r];
267
268 break;
269
270 case GLSL_TYPE_STRUCT:
271 case GLSL_TYPE_ARRAY:
272 ret->elements = ralloc_array(mem_ctx, nir_constant *,
273 ir->type->length);
274 ret->num_elements = ir->type->length;
275
276 for (i = 0; i < ir->type->length; i++)
277 ret->elements[i] = constant_copy(ir->const_elements[i], mem_ctx);
278 break;
279
280 default:
281 unreachable("not reached");
282 }
283
284 return ret;
285 }
286
287 void
288 nir_visitor::visit(ir_variable *ir)
289 {
290 /* TODO: In future we should switch to using the NIR lowering pass but for
291 * now just ignore these variables as GLSL IR should have lowered them.
292 * Anything remaining are just dead vars that weren't cleaned up.
293 */
294 if (ir->data.mode == ir_var_shader_shared)
295 return;
296
297 /* FINISHME: inout parameters */
298 assert(ir->data.mode != ir_var_function_inout);
299
300 if (ir->data.mode == ir_var_function_out)
301 return;
302
303 nir_variable *var = rzalloc(shader, nir_variable);
304 var->type = ir->type;
305 var->name = ralloc_strdup(var, ir->name);
306
307 var->data.always_active_io = ir->data.always_active_io;
308 var->data.read_only = ir->data.read_only;
309 var->data.centroid = ir->data.centroid;
310 var->data.sample = ir->data.sample;
311 var->data.patch = ir->data.patch;
312 var->data.invariant = ir->data.invariant;
313 var->data.location = ir->data.location;
314 var->data.stream = ir->data.stream;
315 var->data.compact = false;
316
317 switch(ir->data.mode) {
318 case ir_var_auto:
319 case ir_var_temporary:
320 if (is_global)
321 var->data.mode = nir_var_private;
322 else
323 var->data.mode = nir_var_function;
324 break;
325
326 case ir_var_function_in:
327 case ir_var_const_in:
328 var->data.mode = nir_var_function;
329 break;
330
331 case ir_var_shader_in:
332 if (shader->info.stage == MESA_SHADER_FRAGMENT &&
333 ir->data.location == VARYING_SLOT_FACE) {
334 /* For whatever reason, GLSL IR makes gl_FrontFacing an input */
335 var->data.location = SYSTEM_VALUE_FRONT_FACE;
336 var->data.mode = nir_var_system_value;
337 } else if (shader->info.stage == MESA_SHADER_GEOMETRY &&
338 ir->data.location == VARYING_SLOT_PRIMITIVE_ID) {
339 /* For whatever reason, GLSL IR makes gl_PrimitiveIDIn an input */
340 var->data.location = SYSTEM_VALUE_PRIMITIVE_ID;
341 var->data.mode = nir_var_system_value;
342 } else {
343 var->data.mode = nir_var_shader_in;
344
345 if (shader->info.stage == MESA_SHADER_TESS_EVAL &&
346 (ir->data.location == VARYING_SLOT_TESS_LEVEL_INNER ||
347 ir->data.location == VARYING_SLOT_TESS_LEVEL_OUTER)) {
348 var->data.compact = ir->type->without_array()->is_scalar();
349 }
350 }
351 break;
352
353 case ir_var_shader_out:
354 var->data.mode = nir_var_shader_out;
355 if (shader->info.stage == MESA_SHADER_TESS_CTRL &&
356 (ir->data.location == VARYING_SLOT_TESS_LEVEL_INNER ||
357 ir->data.location == VARYING_SLOT_TESS_LEVEL_OUTER)) {
358 var->data.compact = ir->type->without_array()->is_scalar();
359 }
360 break;
361
362 case ir_var_uniform:
363 if (ir->get_interface_type())
364 var->data.mode = nir_var_ubo;
365 else
366 var->data.mode = nir_var_uniform;
367 break;
368
369 case ir_var_shader_storage:
370 var->data.mode = nir_var_ssbo;
371 break;
372
373 case ir_var_system_value:
374 var->data.mode = nir_var_system_value;
375 break;
376
377 default:
378 unreachable("not reached");
379 }
380
381 var->data.interpolation = ir->data.interpolation;
382 var->data.origin_upper_left = ir->data.origin_upper_left;
383 var->data.pixel_center_integer = ir->data.pixel_center_integer;
384 var->data.location_frac = ir->data.location_frac;
385
386 if (var->data.pixel_center_integer) {
387 assert(shader->info.stage == MESA_SHADER_FRAGMENT);
388 shader->info.fs.pixel_center_integer = true;
389 }
390
391 switch (ir->data.depth_layout) {
392 case ir_depth_layout_none:
393 var->data.depth_layout = nir_depth_layout_none;
394 break;
395 case ir_depth_layout_any:
396 var->data.depth_layout = nir_depth_layout_any;
397 break;
398 case ir_depth_layout_greater:
399 var->data.depth_layout = nir_depth_layout_greater;
400 break;
401 case ir_depth_layout_less:
402 var->data.depth_layout = nir_depth_layout_less;
403 break;
404 case ir_depth_layout_unchanged:
405 var->data.depth_layout = nir_depth_layout_unchanged;
406 break;
407 default:
408 unreachable("not reached");
409 }
410
411 var->data.index = ir->data.index;
412 var->data.descriptor_set = 0;
413 var->data.binding = ir->data.binding;
414 var->data.explicit_binding = ir->data.explicit_binding;
415 var->data.bindless = ir->data.bindless;
416 var->data.offset = ir->data.offset;
417
418 unsigned image_access = 0;
419 if (ir->data.memory_read_only)
420 image_access |= ACCESS_NON_WRITEABLE;
421 if (ir->data.memory_write_only)
422 image_access |= ACCESS_NON_READABLE;
423 if (ir->data.memory_coherent)
424 image_access |= ACCESS_COHERENT;
425 if (ir->data.memory_volatile)
426 image_access |= ACCESS_VOLATILE;
427 if (ir->data.memory_restrict)
428 image_access |= ACCESS_RESTRICT;
429 var->data.image.access = (gl_access_qualifier)image_access;
430 var->data.image.format = ir->data.image_format;
431
432 var->data.fb_fetch_output = ir->data.fb_fetch_output;
433 var->data.explicit_xfb_buffer = ir->data.explicit_xfb_buffer;
434 var->data.explicit_xfb_stride = ir->data.explicit_xfb_stride;
435 var->data.xfb_buffer = ir->data.xfb_buffer;
436 var->data.xfb_stride = ir->data.xfb_stride;
437
438 var->num_state_slots = ir->get_num_state_slots();
439 if (var->num_state_slots > 0) {
440 var->state_slots = rzalloc_array(var, nir_state_slot,
441 var->num_state_slots);
442
443 ir_state_slot *state_slots = ir->get_state_slots();
444 for (unsigned i = 0; i < var->num_state_slots; i++) {
445 for (unsigned j = 0; j < 5; j++)
446 var->state_slots[i].tokens[j] = state_slots[i].tokens[j];
447 var->state_slots[i].swizzle = state_slots[i].swizzle;
448 }
449 } else {
450 var->state_slots = NULL;
451 }
452
453 var->constant_initializer = constant_copy(ir->constant_initializer, var);
454
455 var->interface_type = ir->get_interface_type();
456
457 if (var->data.mode == nir_var_function)
458 nir_function_impl_add_variable(impl, var);
459 else
460 nir_shader_add_variable(shader, var);
461
462 _mesa_hash_table_insert(var_table, ir, var);
463 }
464
465 ir_visitor_status
466 nir_function_visitor::visit_enter(ir_function *ir)
467 {
468 foreach_in_list(ir_function_signature, sig, &ir->signatures) {
469 visitor->create_function(sig);
470 }
471 return visit_continue_with_parent;
472 }
473
474 void
475 nir_visitor::create_function(ir_function_signature *ir)
476 {
477 if (ir->is_intrinsic())
478 return;
479
480 nir_function *func = nir_function_create(shader, ir->function_name());
481
482 func->num_params = ir->parameters.length() +
483 (ir->return_type != glsl_type::void_type);
484 func->params = ralloc_array(shader, nir_parameter, func->num_params);
485
486 unsigned np = 0;
487
488 if (ir->return_type != glsl_type::void_type) {
489 /* The return value is a variable deref (basically an out parameter) */
490 func->params[np].num_components = 1;
491 func->params[np].bit_size = 32;
492 np++;
493 }
494
495 foreach_in_list(ir_variable, param, &ir->parameters) {
496 /* FINISHME: pass arrays, structs, etc by reference? */
497 assert(param->type->is_vector() || param->type->is_scalar());
498
499 if (param->data.mode == ir_var_function_in) {
500 func->params[np].num_components = param->type->vector_elements;
501 func->params[np].bit_size = glsl_get_bit_size(param->type);
502 } else {
503 func->params[np].num_components = 1;
504 func->params[np].bit_size = 32;
505 }
506 np++;
507 }
508 assert(np == func->num_params);
509
510 _mesa_hash_table_insert(this->overload_table, ir, func);
511 }
512
513 void
514 nir_visitor::visit(ir_function *ir)
515 {
516 foreach_in_list(ir_function_signature, sig, &ir->signatures)
517 sig->accept(this);
518 }
519
520 void
521 nir_visitor::visit(ir_function_signature *ir)
522 {
523 if (ir->is_intrinsic())
524 return;
525
526 this->sig = ir;
527
528 struct hash_entry *entry =
529 _mesa_hash_table_search(this->overload_table, ir);
530
531 assert(entry);
532 nir_function *func = (nir_function *) entry->data;
533
534 if (ir->is_defined) {
535 nir_function_impl *impl = nir_function_impl_create(func);
536 this->impl = impl;
537
538 this->is_global = false;
539
540 nir_builder_init(&b, impl);
541 b.cursor = nir_after_cf_list(&impl->body);
542
543 unsigned i = (ir->return_type != glsl_type::void_type) ? 1 : 0;
544
545 foreach_in_list(ir_variable, param, &ir->parameters) {
546 nir_variable *var =
547 nir_local_variable_create(impl, param->type, param->name);
548
549 if (param->data.mode == ir_var_function_in) {
550 nir_store_var(&b, var, nir_load_param(&b, i), ~0);
551 }
552
553 _mesa_hash_table_insert(var_table, param, var);
554 i++;
555 }
556
557 visit_exec_list(&ir->body, this);
558
559 this->is_global = true;
560 } else {
561 func->impl = NULL;
562 }
563 }
564
565 void
566 nir_visitor::visit(ir_loop *ir)
567 {
568 nir_push_loop(&b);
569 visit_exec_list(&ir->body_instructions, this);
570 nir_pop_loop(&b, NULL);
571 }
572
573 void
574 nir_visitor::visit(ir_if *ir)
575 {
576 nir_push_if(&b, evaluate_rvalue(ir->condition));
577 visit_exec_list(&ir->then_instructions, this);
578 nir_push_else(&b, NULL);
579 visit_exec_list(&ir->else_instructions, this);
580 nir_pop_if(&b, NULL);
581 }
582
583 void
584 nir_visitor::visit(ir_discard *ir)
585 {
586 /*
587 * discards aren't treated as control flow, because before we lower them
588 * they can appear anywhere in the shader and the stuff after them may still
589 * be executed (yay, crazy GLSL rules!). However, after lowering, all the
590 * discards will be immediately followed by a return.
591 */
592
593 nir_intrinsic_instr *discard;
594 if (ir->condition) {
595 discard = nir_intrinsic_instr_create(this->shader,
596 nir_intrinsic_discard_if);
597 discard->src[0] =
598 nir_src_for_ssa(evaluate_rvalue(ir->condition));
599 } else {
600 discard = nir_intrinsic_instr_create(this->shader, nir_intrinsic_discard);
601 }
602
603 nir_builder_instr_insert(&b, &discard->instr);
604 }
605
606 void
607 nir_visitor::visit(ir_emit_vertex *ir)
608 {
609 nir_intrinsic_instr *instr =
610 nir_intrinsic_instr_create(this->shader, nir_intrinsic_emit_vertex);
611 nir_intrinsic_set_stream_id(instr, ir->stream_id());
612 nir_builder_instr_insert(&b, &instr->instr);
613 }
614
615 void
616 nir_visitor::visit(ir_end_primitive *ir)
617 {
618 nir_intrinsic_instr *instr =
619 nir_intrinsic_instr_create(this->shader, nir_intrinsic_end_primitive);
620 nir_intrinsic_set_stream_id(instr, ir->stream_id());
621 nir_builder_instr_insert(&b, &instr->instr);
622 }
623
624 void
625 nir_visitor::visit(ir_loop_jump *ir)
626 {
627 nir_jump_type type;
628 switch (ir->mode) {
629 case ir_loop_jump::jump_break:
630 type = nir_jump_break;
631 break;
632 case ir_loop_jump::jump_continue:
633 type = nir_jump_continue;
634 break;
635 default:
636 unreachable("not reached");
637 }
638
639 nir_jump_instr *instr = nir_jump_instr_create(this->shader, type);
640 nir_builder_instr_insert(&b, &instr->instr);
641 }
642
643 void
644 nir_visitor::visit(ir_return *ir)
645 {
646 if (ir->value != NULL) {
647 nir_deref_instr *ret_deref =
648 nir_build_deref_cast(&b, nir_load_param(&b, 0),
649 nir_var_function, ir->value->type, 0);
650
651 nir_ssa_def *val = evaluate_rvalue(ir->value);
652 nir_store_deref(&b, ret_deref, val, ~0);
653 }
654
655 nir_jump_instr *instr = nir_jump_instr_create(this->shader, nir_jump_return);
656 nir_builder_instr_insert(&b, &instr->instr);
657 }
658
659 static void
660 intrinsic_set_std430_align(nir_intrinsic_instr *intrin, const glsl_type *type)
661 {
662 unsigned bit_size = type->is_boolean() ? 32 : glsl_get_bit_size(type);
663 unsigned pow2_components = util_next_power_of_two(type->vector_elements);
664 nir_intrinsic_set_align(intrin, (bit_size / 8) * pow2_components, 0);
665 }
666
667 void
668 nir_visitor::visit(ir_call *ir)
669 {
670 if (ir->callee->is_intrinsic()) {
671 nir_intrinsic_op op;
672
673 switch (ir->callee->intrinsic_id) {
674 case ir_intrinsic_atomic_counter_read:
675 op = nir_intrinsic_atomic_counter_read_deref;
676 break;
677 case ir_intrinsic_atomic_counter_increment:
678 op = nir_intrinsic_atomic_counter_inc_deref;
679 break;
680 case ir_intrinsic_atomic_counter_predecrement:
681 op = nir_intrinsic_atomic_counter_pre_dec_deref;
682 break;
683 case ir_intrinsic_atomic_counter_add:
684 op = nir_intrinsic_atomic_counter_add_deref;
685 break;
686 case ir_intrinsic_atomic_counter_and:
687 op = nir_intrinsic_atomic_counter_and_deref;
688 break;
689 case ir_intrinsic_atomic_counter_or:
690 op = nir_intrinsic_atomic_counter_or_deref;
691 break;
692 case ir_intrinsic_atomic_counter_xor:
693 op = nir_intrinsic_atomic_counter_xor_deref;
694 break;
695 case ir_intrinsic_atomic_counter_min:
696 op = nir_intrinsic_atomic_counter_min_deref;
697 break;
698 case ir_intrinsic_atomic_counter_max:
699 op = nir_intrinsic_atomic_counter_max_deref;
700 break;
701 case ir_intrinsic_atomic_counter_exchange:
702 op = nir_intrinsic_atomic_counter_exchange_deref;
703 break;
704 case ir_intrinsic_atomic_counter_comp_swap:
705 op = nir_intrinsic_atomic_counter_comp_swap_deref;
706 break;
707 case ir_intrinsic_image_load:
708 op = nir_intrinsic_image_deref_load;
709 break;
710 case ir_intrinsic_image_store:
711 op = nir_intrinsic_image_deref_store;
712 break;
713 case ir_intrinsic_image_atomic_add:
714 op = ir->return_deref->type->is_integer_32_64()
715 ? nir_intrinsic_image_deref_atomic_add
716 : nir_intrinsic_image_deref_atomic_fadd;
717 break;
718 case ir_intrinsic_image_atomic_min:
719 op = nir_intrinsic_image_deref_atomic_min;
720 break;
721 case ir_intrinsic_image_atomic_max:
722 op = nir_intrinsic_image_deref_atomic_max;
723 break;
724 case ir_intrinsic_image_atomic_and:
725 op = nir_intrinsic_image_deref_atomic_and;
726 break;
727 case ir_intrinsic_image_atomic_or:
728 op = nir_intrinsic_image_deref_atomic_or;
729 break;
730 case ir_intrinsic_image_atomic_xor:
731 op = nir_intrinsic_image_deref_atomic_xor;
732 break;
733 case ir_intrinsic_image_atomic_exchange:
734 op = nir_intrinsic_image_deref_atomic_exchange;
735 break;
736 case ir_intrinsic_image_atomic_comp_swap:
737 op = nir_intrinsic_image_deref_atomic_comp_swap;
738 break;
739 case ir_intrinsic_memory_barrier:
740 op = nir_intrinsic_memory_barrier;
741 break;
742 case ir_intrinsic_image_size:
743 op = nir_intrinsic_image_deref_size;
744 break;
745 case ir_intrinsic_image_samples:
746 op = nir_intrinsic_image_deref_samples;
747 break;
748 case ir_intrinsic_ssbo_store:
749 op = nir_intrinsic_store_ssbo;
750 break;
751 case ir_intrinsic_ssbo_load:
752 op = nir_intrinsic_load_ssbo;
753 break;
754 case ir_intrinsic_ssbo_atomic_add:
755 op = ir->return_deref->type->is_integer_32_64()
756 ? nir_intrinsic_ssbo_atomic_add : nir_intrinsic_ssbo_atomic_fadd;
757 break;
758 case ir_intrinsic_ssbo_atomic_and:
759 op = nir_intrinsic_ssbo_atomic_and;
760 break;
761 case ir_intrinsic_ssbo_atomic_or:
762 op = nir_intrinsic_ssbo_atomic_or;
763 break;
764 case ir_intrinsic_ssbo_atomic_xor:
765 op = nir_intrinsic_ssbo_atomic_xor;
766 break;
767 case ir_intrinsic_ssbo_atomic_min:
768 assert(ir->return_deref);
769 if (ir->return_deref->type == glsl_type::int_type)
770 op = nir_intrinsic_ssbo_atomic_imin;
771 else if (ir->return_deref->type == glsl_type::uint_type)
772 op = nir_intrinsic_ssbo_atomic_umin;
773 else if (ir->return_deref->type == glsl_type::float_type)
774 op = nir_intrinsic_ssbo_atomic_fmin;
775 else
776 unreachable("Invalid type");
777 break;
778 case ir_intrinsic_ssbo_atomic_max:
779 assert(ir->return_deref);
780 if (ir->return_deref->type == glsl_type::int_type)
781 op = nir_intrinsic_ssbo_atomic_imax;
782 else if (ir->return_deref->type == glsl_type::uint_type)
783 op = nir_intrinsic_ssbo_atomic_umax;
784 else if (ir->return_deref->type == glsl_type::float_type)
785 op = nir_intrinsic_ssbo_atomic_fmax;
786 else
787 unreachable("Invalid type");
788 break;
789 case ir_intrinsic_ssbo_atomic_exchange:
790 op = nir_intrinsic_ssbo_atomic_exchange;
791 break;
792 case ir_intrinsic_ssbo_atomic_comp_swap:
793 op = ir->return_deref->type->is_integer_32_64()
794 ? nir_intrinsic_ssbo_atomic_comp_swap
795 : nir_intrinsic_ssbo_atomic_fcomp_swap;
796 break;
797 case ir_intrinsic_shader_clock:
798 op = nir_intrinsic_shader_clock;
799 break;
800 case ir_intrinsic_begin_invocation_interlock:
801 op = nir_intrinsic_begin_invocation_interlock;
802 break;
803 case ir_intrinsic_end_invocation_interlock:
804 op = nir_intrinsic_end_invocation_interlock;
805 break;
806 case ir_intrinsic_group_memory_barrier:
807 op = nir_intrinsic_group_memory_barrier;
808 break;
809 case ir_intrinsic_memory_barrier_atomic_counter:
810 op = nir_intrinsic_memory_barrier_atomic_counter;
811 break;
812 case ir_intrinsic_memory_barrier_buffer:
813 op = nir_intrinsic_memory_barrier_buffer;
814 break;
815 case ir_intrinsic_memory_barrier_image:
816 op = nir_intrinsic_memory_barrier_image;
817 break;
818 case ir_intrinsic_memory_barrier_shared:
819 op = nir_intrinsic_memory_barrier_shared;
820 break;
821 case ir_intrinsic_shared_load:
822 op = nir_intrinsic_load_shared;
823 break;
824 case ir_intrinsic_shared_store:
825 op = nir_intrinsic_store_shared;
826 break;
827 case ir_intrinsic_shared_atomic_add:
828 op = ir->return_deref->type->is_integer_32_64()
829 ? nir_intrinsic_shared_atomic_add
830 : nir_intrinsic_shared_atomic_fadd;
831 break;
832 case ir_intrinsic_shared_atomic_and:
833 op = nir_intrinsic_shared_atomic_and;
834 break;
835 case ir_intrinsic_shared_atomic_or:
836 op = nir_intrinsic_shared_atomic_or;
837 break;
838 case ir_intrinsic_shared_atomic_xor:
839 op = nir_intrinsic_shared_atomic_xor;
840 break;
841 case ir_intrinsic_shared_atomic_min:
842 assert(ir->return_deref);
843 if (ir->return_deref->type == glsl_type::int_type)
844 op = nir_intrinsic_shared_atomic_imin;
845 else if (ir->return_deref->type == glsl_type::uint_type)
846 op = nir_intrinsic_shared_atomic_umin;
847 else if (ir->return_deref->type == glsl_type::float_type)
848 op = nir_intrinsic_shared_atomic_fmin;
849 else
850 unreachable("Invalid type");
851 break;
852 case ir_intrinsic_shared_atomic_max:
853 assert(ir->return_deref);
854 if (ir->return_deref->type == glsl_type::int_type)
855 op = nir_intrinsic_shared_atomic_imax;
856 else if (ir->return_deref->type == glsl_type::uint_type)
857 op = nir_intrinsic_shared_atomic_umax;
858 else if (ir->return_deref->type == glsl_type::float_type)
859 op = nir_intrinsic_shared_atomic_fmax;
860 else
861 unreachable("Invalid type");
862 break;
863 case ir_intrinsic_shared_atomic_exchange:
864 op = nir_intrinsic_shared_atomic_exchange;
865 break;
866 case ir_intrinsic_shared_atomic_comp_swap:
867 op = ir->return_deref->type->is_integer_32_64()
868 ? nir_intrinsic_shared_atomic_comp_swap
869 : nir_intrinsic_shared_atomic_fcomp_swap;
870 break;
871 case ir_intrinsic_vote_any:
872 op = nir_intrinsic_vote_any;
873 break;
874 case ir_intrinsic_vote_all:
875 op = nir_intrinsic_vote_all;
876 break;
877 case ir_intrinsic_vote_eq:
878 op = nir_intrinsic_vote_ieq;
879 break;
880 case ir_intrinsic_ballot:
881 op = nir_intrinsic_ballot;
882 break;
883 case ir_intrinsic_read_invocation:
884 op = nir_intrinsic_read_invocation;
885 break;
886 case ir_intrinsic_read_first_invocation:
887 op = nir_intrinsic_read_first_invocation;
888 break;
889 default:
890 unreachable("not reached");
891 }
892
893 nir_intrinsic_instr *instr = nir_intrinsic_instr_create(shader, op);
894 nir_ssa_def *ret = &instr->dest.ssa;
895
896 switch (op) {
897 case nir_intrinsic_atomic_counter_read_deref:
898 case nir_intrinsic_atomic_counter_inc_deref:
899 case nir_intrinsic_atomic_counter_pre_dec_deref:
900 case nir_intrinsic_atomic_counter_add_deref:
901 case nir_intrinsic_atomic_counter_min_deref:
902 case nir_intrinsic_atomic_counter_max_deref:
903 case nir_intrinsic_atomic_counter_and_deref:
904 case nir_intrinsic_atomic_counter_or_deref:
905 case nir_intrinsic_atomic_counter_xor_deref:
906 case nir_intrinsic_atomic_counter_exchange_deref:
907 case nir_intrinsic_atomic_counter_comp_swap_deref: {
908 /* Set the counter variable dereference. */
909 exec_node *param = ir->actual_parameters.get_head();
910 ir_dereference *counter = (ir_dereference *)param;
911
912 instr->src[0] = nir_src_for_ssa(&evaluate_deref(counter)->dest.ssa);
913 param = param->get_next();
914
915 /* Set the intrinsic destination. */
916 if (ir->return_deref) {
917 nir_ssa_dest_init(&instr->instr, &instr->dest, 1, 32, NULL);
918 }
919
920 /* Set the intrinsic parameters. */
921 if (!param->is_tail_sentinel()) {
922 instr->src[1] =
923 nir_src_for_ssa(evaluate_rvalue((ir_dereference *)param));
924 param = param->get_next();
925 }
926
927 if (!param->is_tail_sentinel()) {
928 instr->src[2] =
929 nir_src_for_ssa(evaluate_rvalue((ir_dereference *)param));
930 param = param->get_next();
931 }
932
933 nir_builder_instr_insert(&b, &instr->instr);
934 break;
935 }
936 case nir_intrinsic_image_deref_load:
937 case nir_intrinsic_image_deref_store:
938 case nir_intrinsic_image_deref_atomic_add:
939 case nir_intrinsic_image_deref_atomic_min:
940 case nir_intrinsic_image_deref_atomic_max:
941 case nir_intrinsic_image_deref_atomic_and:
942 case nir_intrinsic_image_deref_atomic_or:
943 case nir_intrinsic_image_deref_atomic_xor:
944 case nir_intrinsic_image_deref_atomic_exchange:
945 case nir_intrinsic_image_deref_atomic_comp_swap:
946 case nir_intrinsic_image_deref_atomic_fadd:
947 case nir_intrinsic_image_deref_samples:
948 case nir_intrinsic_image_deref_size: {
949 nir_ssa_undef_instr *instr_undef =
950 nir_ssa_undef_instr_create(shader, 1, 32);
951 nir_builder_instr_insert(&b, &instr_undef->instr);
952
953 /* Set the image variable dereference. */
954 exec_node *param = ir->actual_parameters.get_head();
955 ir_dereference *image = (ir_dereference *)param;
956 const glsl_type *type =
957 image->variable_referenced()->type->without_array();
958
959 instr->src[0] = nir_src_for_ssa(&evaluate_deref(image)->dest.ssa);
960 param = param->get_next();
961
962 /* Set the intrinsic destination. */
963 if (ir->return_deref) {
964 unsigned num_components = ir->return_deref->type->vector_elements;
965 nir_ssa_dest_init(&instr->instr, &instr->dest,
966 num_components, 32, NULL);
967 }
968
969 if (op == nir_intrinsic_image_deref_size) {
970 instr->num_components = instr->dest.ssa.num_components;
971 } else if (op == nir_intrinsic_image_deref_load ||
972 op == nir_intrinsic_image_deref_store) {
973 instr->num_components = 4;
974 }
975
976 if (op == nir_intrinsic_image_deref_size ||
977 op == nir_intrinsic_image_deref_samples) {
978 nir_builder_instr_insert(&b, &instr->instr);
979 break;
980 }
981
982 /* Set the address argument, extending the coordinate vector to four
983 * components.
984 */
985 nir_ssa_def *src_addr =
986 evaluate_rvalue((ir_dereference *)param);
987 nir_ssa_def *srcs[4];
988
989 for (int i = 0; i < 4; i++) {
990 if (i < type->coordinate_components())
991 srcs[i] = nir_channel(&b, src_addr, i);
992 else
993 srcs[i] = &instr_undef->def;
994 }
995
996 instr->src[1] = nir_src_for_ssa(nir_vec(&b, srcs, 4));
997 param = param->get_next();
998
999 /* Set the sample argument, which is undefined for single-sample
1000 * images.
1001 */
1002 if (type->sampler_dimensionality == GLSL_SAMPLER_DIM_MS) {
1003 instr->src[2] =
1004 nir_src_for_ssa(evaluate_rvalue((ir_dereference *)param));
1005 param = param->get_next();
1006 } else {
1007 instr->src[2] = nir_src_for_ssa(&instr_undef->def);
1008 }
1009
1010 /* Set the intrinsic parameters. */
1011 if (!param->is_tail_sentinel()) {
1012 instr->src[3] =
1013 nir_src_for_ssa(evaluate_rvalue((ir_dereference *)param));
1014 param = param->get_next();
1015 }
1016
1017 if (!param->is_tail_sentinel()) {
1018 instr->src[4] =
1019 nir_src_for_ssa(evaluate_rvalue((ir_dereference *)param));
1020 param = param->get_next();
1021 }
1022 nir_builder_instr_insert(&b, &instr->instr);
1023 break;
1024 }
1025 case nir_intrinsic_memory_barrier:
1026 case nir_intrinsic_group_memory_barrier:
1027 case nir_intrinsic_memory_barrier_atomic_counter:
1028 case nir_intrinsic_memory_barrier_buffer:
1029 case nir_intrinsic_memory_barrier_image:
1030 case nir_intrinsic_memory_barrier_shared:
1031 nir_builder_instr_insert(&b, &instr->instr);
1032 break;
1033 case nir_intrinsic_shader_clock:
1034 nir_ssa_dest_init(&instr->instr, &instr->dest, 2, 32, NULL);
1035 instr->num_components = 2;
1036 nir_builder_instr_insert(&b, &instr->instr);
1037 break;
1038 case nir_intrinsic_begin_invocation_interlock:
1039 nir_builder_instr_insert(&b, &instr->instr);
1040 break;
1041 case nir_intrinsic_end_invocation_interlock:
1042 nir_builder_instr_insert(&b, &instr->instr);
1043 break;
1044 case nir_intrinsic_store_ssbo: {
1045 exec_node *param = ir->actual_parameters.get_head();
1046 ir_rvalue *block = ((ir_instruction *)param)->as_rvalue();
1047
1048 param = param->get_next();
1049 ir_rvalue *offset = ((ir_instruction *)param)->as_rvalue();
1050
1051 param = param->get_next();
1052 ir_rvalue *val = ((ir_instruction *)param)->as_rvalue();
1053
1054 param = param->get_next();
1055 ir_constant *write_mask = ((ir_instruction *)param)->as_constant();
1056 assert(write_mask);
1057
1058 nir_ssa_def *nir_val = evaluate_rvalue(val);
1059 if (val->type->is_boolean())
1060 nir_val = nir_b2i32(&b, nir_val);
1061
1062 instr->src[0] = nir_src_for_ssa(nir_val);
1063 instr->src[1] = nir_src_for_ssa(evaluate_rvalue(block));
1064 instr->src[2] = nir_src_for_ssa(evaluate_rvalue(offset));
1065 intrinsic_set_std430_align(instr, val->type);
1066 nir_intrinsic_set_write_mask(instr, write_mask->value.u[0]);
1067 instr->num_components = val->type->vector_elements;
1068
1069 nir_builder_instr_insert(&b, &instr->instr);
1070 break;
1071 }
1072 case nir_intrinsic_load_ssbo: {
1073 exec_node *param = ir->actual_parameters.get_head();
1074 ir_rvalue *block = ((ir_instruction *)param)->as_rvalue();
1075
1076 param = param->get_next();
1077 ir_rvalue *offset = ((ir_instruction *)param)->as_rvalue();
1078
1079 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(block));
1080 instr->src[1] = nir_src_for_ssa(evaluate_rvalue(offset));
1081
1082 const glsl_type *type = ir->return_deref->var->type;
1083 instr->num_components = type->vector_elements;
1084 intrinsic_set_std430_align(instr, type);
1085
1086 /* Setup destination register */
1087 unsigned bit_size = type->is_boolean() ? 32 : glsl_get_bit_size(type);
1088 nir_ssa_dest_init(&instr->instr, &instr->dest,
1089 type->vector_elements, bit_size, NULL);
1090
1091 /* Insert the created nir instruction now since in the case of boolean
1092 * result we will need to emit another instruction after it
1093 */
1094 nir_builder_instr_insert(&b, &instr->instr);
1095
1096 /*
1097 * In SSBO/UBO's, a true boolean value is any non-zero value, but we
1098 * consider a true boolean to be ~0. Fix this up with a != 0
1099 * comparison.
1100 */
1101 if (type->is_boolean())
1102 ret = nir_i2b(&b, &instr->dest.ssa);
1103 break;
1104 }
1105 case nir_intrinsic_ssbo_atomic_add:
1106 case nir_intrinsic_ssbo_atomic_imin:
1107 case nir_intrinsic_ssbo_atomic_umin:
1108 case nir_intrinsic_ssbo_atomic_imax:
1109 case nir_intrinsic_ssbo_atomic_umax:
1110 case nir_intrinsic_ssbo_atomic_and:
1111 case nir_intrinsic_ssbo_atomic_or:
1112 case nir_intrinsic_ssbo_atomic_xor:
1113 case nir_intrinsic_ssbo_atomic_exchange:
1114 case nir_intrinsic_ssbo_atomic_comp_swap:
1115 case nir_intrinsic_ssbo_atomic_fadd:
1116 case nir_intrinsic_ssbo_atomic_fmin:
1117 case nir_intrinsic_ssbo_atomic_fmax:
1118 case nir_intrinsic_ssbo_atomic_fcomp_swap: {
1119 int param_count = ir->actual_parameters.length();
1120 assert(param_count == 3 || param_count == 4);
1121
1122 /* Block index */
1123 exec_node *param = ir->actual_parameters.get_head();
1124 ir_instruction *inst = (ir_instruction *) param;
1125 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
1126
1127 /* Offset */
1128 param = param->get_next();
1129 inst = (ir_instruction *) param;
1130 instr->src[1] = nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
1131
1132 /* data1 parameter (this is always present) */
1133 param = param->get_next();
1134 inst = (ir_instruction *) param;
1135 instr->src[2] = nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
1136
1137 /* data2 parameter (only with atomic_comp_swap) */
1138 if (param_count == 4) {
1139 assert(op == nir_intrinsic_ssbo_atomic_comp_swap ||
1140 op == nir_intrinsic_ssbo_atomic_fcomp_swap);
1141 param = param->get_next();
1142 inst = (ir_instruction *) param;
1143 instr->src[3] = nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
1144 }
1145
1146 /* Atomic result */
1147 assert(ir->return_deref);
1148 nir_ssa_dest_init(&instr->instr, &instr->dest,
1149 ir->return_deref->type->vector_elements, 32, NULL);
1150 nir_builder_instr_insert(&b, &instr->instr);
1151 break;
1152 }
1153 case nir_intrinsic_load_shared: {
1154 exec_node *param = ir->actual_parameters.get_head();
1155 ir_rvalue *offset = ((ir_instruction *)param)->as_rvalue();
1156
1157 nir_intrinsic_set_base(instr, 0);
1158 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(offset));
1159
1160 const glsl_type *type = ir->return_deref->var->type;
1161 instr->num_components = type->vector_elements;
1162 intrinsic_set_std430_align(instr, type);
1163
1164 /* Setup destination register */
1165 unsigned bit_size = type->is_boolean() ? 32 : glsl_get_bit_size(type);
1166 nir_ssa_dest_init(&instr->instr, &instr->dest,
1167 type->vector_elements, bit_size, NULL);
1168
1169 nir_builder_instr_insert(&b, &instr->instr);
1170
1171 /* The value in shared memory is a 32-bit value */
1172 if (type->is_boolean())
1173 ret = nir_i2b(&b, &instr->dest.ssa);
1174 break;
1175 }
1176 case nir_intrinsic_store_shared: {
1177 exec_node *param = ir->actual_parameters.get_head();
1178 ir_rvalue *offset = ((ir_instruction *)param)->as_rvalue();
1179
1180 param = param->get_next();
1181 ir_rvalue *val = ((ir_instruction *)param)->as_rvalue();
1182
1183 param = param->get_next();
1184 ir_constant *write_mask = ((ir_instruction *)param)->as_constant();
1185 assert(write_mask);
1186
1187 nir_intrinsic_set_base(instr, 0);
1188 instr->src[1] = nir_src_for_ssa(evaluate_rvalue(offset));
1189
1190 nir_intrinsic_set_write_mask(instr, write_mask->value.u[0]);
1191
1192 nir_ssa_def *nir_val = evaluate_rvalue(val);
1193 /* The value in shared memory is a 32-bit value */
1194 if (val->type->is_boolean())
1195 nir_val = nir_b2i32(&b, nir_val);
1196
1197 instr->src[0] = nir_src_for_ssa(nir_val);
1198 instr->num_components = val->type->vector_elements;
1199 intrinsic_set_std430_align(instr, val->type);
1200
1201 nir_builder_instr_insert(&b, &instr->instr);
1202 break;
1203 }
1204 case nir_intrinsic_shared_atomic_add:
1205 case nir_intrinsic_shared_atomic_imin:
1206 case nir_intrinsic_shared_atomic_umin:
1207 case nir_intrinsic_shared_atomic_imax:
1208 case nir_intrinsic_shared_atomic_umax:
1209 case nir_intrinsic_shared_atomic_and:
1210 case nir_intrinsic_shared_atomic_or:
1211 case nir_intrinsic_shared_atomic_xor:
1212 case nir_intrinsic_shared_atomic_exchange:
1213 case nir_intrinsic_shared_atomic_comp_swap:
1214 case nir_intrinsic_shared_atomic_fadd:
1215 case nir_intrinsic_shared_atomic_fmin:
1216 case nir_intrinsic_shared_atomic_fmax:
1217 case nir_intrinsic_shared_atomic_fcomp_swap: {
1218 int param_count = ir->actual_parameters.length();
1219 assert(param_count == 2 || param_count == 3);
1220
1221 /* Offset */
1222 exec_node *param = ir->actual_parameters.get_head();
1223 ir_instruction *inst = (ir_instruction *) param;
1224 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
1225
1226 /* data1 parameter (this is always present) */
1227 param = param->get_next();
1228 inst = (ir_instruction *) param;
1229 instr->src[1] = nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
1230
1231 /* data2 parameter (only with atomic_comp_swap) */
1232 if (param_count == 3) {
1233 assert(op == nir_intrinsic_shared_atomic_comp_swap ||
1234 op == nir_intrinsic_shared_atomic_fcomp_swap);
1235 param = param->get_next();
1236 inst = (ir_instruction *) param;
1237 instr->src[2] =
1238 nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
1239 }
1240
1241 /* Atomic result */
1242 assert(ir->return_deref);
1243 unsigned bit_size = glsl_get_bit_size(ir->return_deref->type);
1244 nir_ssa_dest_init(&instr->instr, &instr->dest,
1245 ir->return_deref->type->vector_elements,
1246 bit_size, NULL);
1247 nir_builder_instr_insert(&b, &instr->instr);
1248 break;
1249 }
1250 case nir_intrinsic_vote_any:
1251 case nir_intrinsic_vote_all:
1252 case nir_intrinsic_vote_ieq: {
1253 nir_ssa_dest_init(&instr->instr, &instr->dest, 1, 1, NULL);
1254 instr->num_components = 1;
1255
1256 ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
1257 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(value));
1258
1259 nir_builder_instr_insert(&b, &instr->instr);
1260 break;
1261 }
1262
1263 case nir_intrinsic_ballot: {
1264 nir_ssa_dest_init(&instr->instr, &instr->dest,
1265 ir->return_deref->type->vector_elements, 64, NULL);
1266 instr->num_components = ir->return_deref->type->vector_elements;
1267
1268 ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
1269 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(value));
1270
1271 nir_builder_instr_insert(&b, &instr->instr);
1272 break;
1273 }
1274 case nir_intrinsic_read_invocation: {
1275 nir_ssa_dest_init(&instr->instr, &instr->dest,
1276 ir->return_deref->type->vector_elements, 32, NULL);
1277 instr->num_components = ir->return_deref->type->vector_elements;
1278
1279 ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
1280 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(value));
1281
1282 ir_rvalue *invocation = (ir_rvalue *) ir->actual_parameters.get_head()->next;
1283 instr->src[1] = nir_src_for_ssa(evaluate_rvalue(invocation));
1284
1285 nir_builder_instr_insert(&b, &instr->instr);
1286 break;
1287 }
1288 case nir_intrinsic_read_first_invocation: {
1289 nir_ssa_dest_init(&instr->instr, &instr->dest,
1290 ir->return_deref->type->vector_elements, 32, NULL);
1291 instr->num_components = ir->return_deref->type->vector_elements;
1292
1293 ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
1294 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(value));
1295
1296 nir_builder_instr_insert(&b, &instr->instr);
1297 break;
1298 }
1299 default:
1300 unreachable("not reached");
1301 }
1302
1303 if (ir->return_deref)
1304 nir_store_deref(&b, evaluate_deref(ir->return_deref), ret, ~0);
1305
1306 return;
1307 }
1308
1309 struct hash_entry *entry =
1310 _mesa_hash_table_search(this->overload_table, ir->callee);
1311 assert(entry);
1312 nir_function *callee = (nir_function *) entry->data;
1313
1314 nir_call_instr *call = nir_call_instr_create(this->shader, callee);
1315
1316 unsigned i = 0;
1317 nir_deref_instr *ret_deref = NULL;
1318 if (ir->return_deref) {
1319 nir_variable *ret_tmp =
1320 nir_local_variable_create(this->impl, ir->return_deref->type,
1321 "return_tmp");
1322 ret_deref = nir_build_deref_var(&b, ret_tmp);
1323 call->params[i++] = nir_src_for_ssa(&ret_deref->dest.ssa);
1324 }
1325
1326 foreach_two_lists(formal_node, &ir->callee->parameters,
1327 actual_node, &ir->actual_parameters) {
1328 ir_rvalue *param_rvalue = (ir_rvalue *) actual_node;
1329 ir_variable *sig_param = (ir_variable *) formal_node;
1330
1331 if (sig_param->data.mode == ir_var_function_out) {
1332 nir_deref_instr *out_deref = evaluate_deref(param_rvalue);
1333 call->params[i] = nir_src_for_ssa(&out_deref->dest.ssa);
1334 } else if (sig_param->data.mode == ir_var_function_in) {
1335 nir_ssa_def *val = evaluate_rvalue(param_rvalue);
1336 nir_src src = nir_src_for_ssa(val);
1337
1338 nir_src_copy(&call->params[i], &src, call);
1339 } else if (sig_param->data.mode == ir_var_function_inout) {
1340 unreachable("unimplemented: inout parameters");
1341 }
1342
1343 i++;
1344 }
1345
1346 nir_builder_instr_insert(&b, &call->instr);
1347
1348 if (ir->return_deref)
1349 nir_store_deref(&b, evaluate_deref(ir->return_deref), nir_load_deref(&b, ret_deref), ~0);
1350 }
1351
1352 void
1353 nir_visitor::visit(ir_assignment *ir)
1354 {
1355 unsigned num_components = ir->lhs->type->vector_elements;
1356
1357 b.exact = ir->lhs->variable_referenced()->data.invariant ||
1358 ir->lhs->variable_referenced()->data.precise;
1359
1360 if ((ir->rhs->as_dereference() || ir->rhs->as_constant()) &&
1361 (ir->write_mask == (1 << num_components) - 1 || ir->write_mask == 0)) {
1362 if (ir->condition) {
1363 nir_push_if(&b, evaluate_rvalue(ir->condition));
1364 nir_copy_deref(&b, evaluate_deref(ir->lhs), evaluate_deref(ir->rhs));
1365 nir_pop_if(&b, NULL);
1366 } else {
1367 nir_copy_deref(&b, evaluate_deref(ir->lhs), evaluate_deref(ir->rhs));
1368 }
1369 return;
1370 }
1371
1372 assert(ir->rhs->type->is_scalar() || ir->rhs->type->is_vector());
1373
1374 ir->lhs->accept(this);
1375 nir_deref_instr *lhs_deref = this->deref;
1376 nir_ssa_def *src = evaluate_rvalue(ir->rhs);
1377
1378 if (ir->write_mask != (1 << num_components) - 1 && ir->write_mask != 0) {
1379 /* GLSL IR will give us the input to the write-masked assignment in a
1380 * single packed vector. So, for example, if the writemask is xzw, then
1381 * we have to swizzle x -> x, y -> z, and z -> w and get the y component
1382 * from the load.
1383 */
1384 unsigned swiz[4];
1385 unsigned component = 0;
1386 for (unsigned i = 0; i < 4; i++) {
1387 swiz[i] = ir->write_mask & (1 << i) ? component++ : 0;
1388 }
1389 src = nir_swizzle(&b, src, swiz, num_components, !supports_ints);
1390 }
1391
1392 if (ir->condition) {
1393 nir_push_if(&b, evaluate_rvalue(ir->condition));
1394 nir_store_deref(&b, lhs_deref, src, ir->write_mask);
1395 nir_pop_if(&b, NULL);
1396 } else {
1397 nir_store_deref(&b, lhs_deref, src, ir->write_mask);
1398 }
1399 }
1400
1401 /*
1402 * Given an instruction, returns a pointer to its destination or NULL if there
1403 * is no destination.
1404 *
1405 * Note that this only handles instructions we generate at this level.
1406 */
1407 static nir_dest *
1408 get_instr_dest(nir_instr *instr)
1409 {
1410 nir_alu_instr *alu_instr;
1411 nir_intrinsic_instr *intrinsic_instr;
1412 nir_tex_instr *tex_instr;
1413
1414 switch (instr->type) {
1415 case nir_instr_type_alu:
1416 alu_instr = nir_instr_as_alu(instr);
1417 return &alu_instr->dest.dest;
1418
1419 case nir_instr_type_intrinsic:
1420 intrinsic_instr = nir_instr_as_intrinsic(instr);
1421 if (nir_intrinsic_infos[intrinsic_instr->intrinsic].has_dest)
1422 return &intrinsic_instr->dest;
1423 else
1424 return NULL;
1425
1426 case nir_instr_type_tex:
1427 tex_instr = nir_instr_as_tex(instr);
1428 return &tex_instr->dest;
1429
1430 default:
1431 unreachable("not reached");
1432 }
1433
1434 return NULL;
1435 }
1436
1437 void
1438 nir_visitor::add_instr(nir_instr *instr, unsigned num_components,
1439 unsigned bit_size)
1440 {
1441 nir_dest *dest = get_instr_dest(instr);
1442
1443 if (dest)
1444 nir_ssa_dest_init(instr, dest, num_components, bit_size, NULL);
1445
1446 nir_builder_instr_insert(&b, instr);
1447
1448 if (dest) {
1449 assert(dest->is_ssa);
1450 this->result = &dest->ssa;
1451 }
1452 }
1453
1454 nir_ssa_def *
1455 nir_visitor::evaluate_rvalue(ir_rvalue* ir)
1456 {
1457 ir->accept(this);
1458 if (ir->as_dereference() || ir->as_constant()) {
1459 /*
1460 * A dereference is being used on the right hand side, which means we
1461 * must emit a variable load.
1462 */
1463
1464 this->result = nir_load_deref(&b, this->deref);
1465 }
1466
1467 return this->result;
1468 }
1469
1470 static bool
1471 type_is_float(glsl_base_type type)
1472 {
1473 return type == GLSL_TYPE_FLOAT || type == GLSL_TYPE_DOUBLE ||
1474 type == GLSL_TYPE_FLOAT16;
1475 }
1476
1477 static bool
1478 type_is_signed(glsl_base_type type)
1479 {
1480 return type == GLSL_TYPE_INT || type == GLSL_TYPE_INT64 ||
1481 type == GLSL_TYPE_INT16;
1482 }
1483
1484 void
1485 nir_visitor::visit(ir_expression *ir)
1486 {
1487 /* Some special cases */
1488 switch (ir->operation) {
1489 case ir_binop_ubo_load: {
1490 nir_intrinsic_instr *load =
1491 nir_intrinsic_instr_create(this->shader, nir_intrinsic_load_ubo);
1492 unsigned bit_size = ir->type->is_boolean() ? 32 :
1493 glsl_get_bit_size(ir->type);
1494 load->num_components = ir->type->vector_elements;
1495 load->src[0] = nir_src_for_ssa(evaluate_rvalue(ir->operands[0]));
1496 load->src[1] = nir_src_for_ssa(evaluate_rvalue(ir->operands[1]));
1497 intrinsic_set_std430_align(load, ir->type);
1498 add_instr(&load->instr, ir->type->vector_elements, bit_size);
1499
1500 /*
1501 * In UBO's, a true boolean value is any non-zero value, but we consider
1502 * a true boolean to be ~0. Fix this up with a != 0 comparison.
1503 */
1504
1505 if (ir->type->is_boolean())
1506 this->result = nir_i2b(&b, &load->dest.ssa);
1507
1508 return;
1509 }
1510
1511 case ir_unop_interpolate_at_centroid:
1512 case ir_binop_interpolate_at_offset:
1513 case ir_binop_interpolate_at_sample: {
1514 ir_dereference *deref = ir->operands[0]->as_dereference();
1515 ir_swizzle *swizzle = NULL;
1516 if (!deref) {
1517 /* the api does not allow a swizzle here, but the varying packing code
1518 * may have pushed one into here.
1519 */
1520 swizzle = ir->operands[0]->as_swizzle();
1521 assert(swizzle);
1522 deref = swizzle->val->as_dereference();
1523 assert(deref);
1524 }
1525
1526 deref->accept(this);
1527
1528 nir_intrinsic_op op;
1529 if (this->deref->mode == nir_var_shader_in) {
1530 switch (ir->operation) {
1531 case ir_unop_interpolate_at_centroid:
1532 op = nir_intrinsic_interp_deref_at_centroid;
1533 break;
1534 case ir_binop_interpolate_at_offset:
1535 op = nir_intrinsic_interp_deref_at_offset;
1536 break;
1537 case ir_binop_interpolate_at_sample:
1538 op = nir_intrinsic_interp_deref_at_sample;
1539 break;
1540 default:
1541 unreachable("Invalid interpolation intrinsic");
1542 }
1543 } else {
1544 /* This case can happen if the vertex shader does not write the
1545 * given varying. In this case, the linker will lower it to a
1546 * global variable. Since interpolating a variable makes no
1547 * sense, we'll just turn it into a load which will probably
1548 * eventually end up as an SSA definition.
1549 */
1550 assert(this->deref->mode == nir_var_private);
1551 op = nir_intrinsic_load_deref;
1552 }
1553
1554 nir_intrinsic_instr *intrin = nir_intrinsic_instr_create(shader, op);
1555 intrin->num_components = deref->type->vector_elements;
1556 intrin->src[0] = nir_src_for_ssa(&this->deref->dest.ssa);
1557
1558 if (intrin->intrinsic == nir_intrinsic_interp_deref_at_offset ||
1559 intrin->intrinsic == nir_intrinsic_interp_deref_at_sample)
1560 intrin->src[1] = nir_src_for_ssa(evaluate_rvalue(ir->operands[1]));
1561
1562 unsigned bit_size = glsl_get_bit_size(deref->type);
1563 add_instr(&intrin->instr, deref->type->vector_elements, bit_size);
1564
1565 if (swizzle) {
1566 unsigned swiz[4] = {
1567 swizzle->mask.x, swizzle->mask.y, swizzle->mask.z, swizzle->mask.w
1568 };
1569
1570 result = nir_swizzle(&b, result, swiz,
1571 swizzle->type->vector_elements, false);
1572 }
1573
1574 return;
1575 }
1576
1577 default:
1578 break;
1579 }
1580
1581 nir_ssa_def *srcs[4];
1582 for (unsigned i = 0; i < ir->num_operands; i++)
1583 srcs[i] = evaluate_rvalue(ir->operands[i]);
1584
1585 glsl_base_type types[4];
1586 for (unsigned i = 0; i < ir->num_operands; i++)
1587 if (supports_ints)
1588 types[i] = ir->operands[i]->type->base_type;
1589 else
1590 types[i] = GLSL_TYPE_FLOAT;
1591
1592 glsl_base_type out_type;
1593 if (supports_ints)
1594 out_type = ir->type->base_type;
1595 else
1596 out_type = GLSL_TYPE_FLOAT;
1597
1598 switch (ir->operation) {
1599 case ir_unop_bit_not: result = nir_inot(&b, srcs[0]); break;
1600 case ir_unop_logic_not:
1601 result = supports_ints ? nir_inot(&b, srcs[0]) : nir_fnot(&b, srcs[0]);
1602 break;
1603 case ir_unop_neg:
1604 result = type_is_float(types[0]) ? nir_fneg(&b, srcs[0])
1605 : nir_ineg(&b, srcs[0]);
1606 break;
1607 case ir_unop_abs:
1608 result = type_is_float(types[0]) ? nir_fabs(&b, srcs[0])
1609 : nir_iabs(&b, srcs[0]);
1610 break;
1611 case ir_unop_saturate:
1612 assert(type_is_float(types[0]));
1613 result = nir_fsat(&b, srcs[0]);
1614 break;
1615 case ir_unop_sign:
1616 result = type_is_float(types[0]) ? nir_fsign(&b, srcs[0])
1617 : nir_isign(&b, srcs[0]);
1618 break;
1619 case ir_unop_rcp: result = nir_frcp(&b, srcs[0]); break;
1620 case ir_unop_rsq: result = nir_frsq(&b, srcs[0]); break;
1621 case ir_unop_sqrt: result = nir_fsqrt(&b, srcs[0]); break;
1622 case ir_unop_exp: unreachable("ir_unop_exp should have been lowered");
1623 case ir_unop_log: unreachable("ir_unop_log should have been lowered");
1624 case ir_unop_exp2: result = nir_fexp2(&b, srcs[0]); break;
1625 case ir_unop_log2: result = nir_flog2(&b, srcs[0]); break;
1626 case ir_unop_i2f:
1627 result = supports_ints ? nir_i2f32(&b, srcs[0]) : nir_fmov(&b, srcs[0]);
1628 break;
1629 case ir_unop_u2f:
1630 result = supports_ints ? nir_u2f32(&b, srcs[0]) : nir_fmov(&b, srcs[0]);
1631 break;
1632 case ir_unop_b2f:
1633 result = supports_ints ? nir_b2f32(&b, srcs[0]) : nir_fmov(&b, srcs[0]);
1634 break;
1635 case ir_unop_f2i:
1636 case ir_unop_f2u:
1637 case ir_unop_f2b:
1638 case ir_unop_i2b:
1639 case ir_unop_b2i:
1640 case ir_unop_b2i64:
1641 case ir_unop_d2f:
1642 case ir_unop_f2d:
1643 case ir_unop_d2i:
1644 case ir_unop_d2u:
1645 case ir_unop_d2b:
1646 case ir_unop_i2d:
1647 case ir_unop_u2d:
1648 case ir_unop_i642i:
1649 case ir_unop_i642u:
1650 case ir_unop_i642f:
1651 case ir_unop_i642b:
1652 case ir_unop_i642d:
1653 case ir_unop_u642i:
1654 case ir_unop_u642u:
1655 case ir_unop_u642f:
1656 case ir_unop_u642d:
1657 case ir_unop_i2i64:
1658 case ir_unop_u2i64:
1659 case ir_unop_f2i64:
1660 case ir_unop_d2i64:
1661 case ir_unop_i2u64:
1662 case ir_unop_u2u64:
1663 case ir_unop_f2u64:
1664 case ir_unop_d2u64:
1665 case ir_unop_i2u:
1666 case ir_unop_u2i:
1667 case ir_unop_i642u64:
1668 case ir_unop_u642i64: {
1669 nir_alu_type src_type = nir_get_nir_type_for_glsl_base_type(types[0]);
1670 nir_alu_type dst_type = nir_get_nir_type_for_glsl_base_type(out_type);
1671 result = nir_build_alu(&b, nir_type_conversion_op(src_type, dst_type,
1672 nir_rounding_mode_undef),
1673 srcs[0], NULL, NULL, NULL);
1674 /* b2i and b2f don't have fixed bit-size versions so the builder will
1675 * just assume 32 and we have to fix it up here.
1676 */
1677 result->bit_size = nir_alu_type_get_type_size(dst_type);
1678 break;
1679 }
1680
1681 case ir_unop_bitcast_i2f:
1682 case ir_unop_bitcast_f2i:
1683 case ir_unop_bitcast_u2f:
1684 case ir_unop_bitcast_f2u:
1685 case ir_unop_bitcast_i642d:
1686 case ir_unop_bitcast_d2i64:
1687 case ir_unop_bitcast_u642d:
1688 case ir_unop_bitcast_d2u64:
1689 case ir_unop_subroutine_to_int:
1690 /* no-op */
1691 result = nir_imov(&b, srcs[0]);
1692 break;
1693 case ir_unop_trunc: result = nir_ftrunc(&b, srcs[0]); break;
1694 case ir_unop_ceil: result = nir_fceil(&b, srcs[0]); break;
1695 case ir_unop_floor: result = nir_ffloor(&b, srcs[0]); break;
1696 case ir_unop_fract: result = nir_ffract(&b, srcs[0]); break;
1697 case ir_unop_frexp_exp: result = nir_frexp_exp(&b, srcs[0]); break;
1698 case ir_unop_frexp_sig: result = nir_frexp_sig(&b, srcs[0]); break;
1699 case ir_unop_round_even: result = nir_fround_even(&b, srcs[0]); break;
1700 case ir_unop_sin: result = nir_fsin(&b, srcs[0]); break;
1701 case ir_unop_cos: result = nir_fcos(&b, srcs[0]); break;
1702 case ir_unop_dFdx: result = nir_fddx(&b, srcs[0]); break;
1703 case ir_unop_dFdy: result = nir_fddy(&b, srcs[0]); break;
1704 case ir_unop_dFdx_fine: result = nir_fddx_fine(&b, srcs[0]); break;
1705 case ir_unop_dFdy_fine: result = nir_fddy_fine(&b, srcs[0]); break;
1706 case ir_unop_dFdx_coarse: result = nir_fddx_coarse(&b, srcs[0]); break;
1707 case ir_unop_dFdy_coarse: result = nir_fddy_coarse(&b, srcs[0]); break;
1708 case ir_unop_pack_snorm_2x16:
1709 result = nir_pack_snorm_2x16(&b, srcs[0]);
1710 break;
1711 case ir_unop_pack_snorm_4x8:
1712 result = nir_pack_snorm_4x8(&b, srcs[0]);
1713 break;
1714 case ir_unop_pack_unorm_2x16:
1715 result = nir_pack_unorm_2x16(&b, srcs[0]);
1716 break;
1717 case ir_unop_pack_unorm_4x8:
1718 result = nir_pack_unorm_4x8(&b, srcs[0]);
1719 break;
1720 case ir_unop_pack_half_2x16:
1721 result = nir_pack_half_2x16(&b, srcs[0]);
1722 break;
1723 case ir_unop_unpack_snorm_2x16:
1724 result = nir_unpack_snorm_2x16(&b, srcs[0]);
1725 break;
1726 case ir_unop_unpack_snorm_4x8:
1727 result = nir_unpack_snorm_4x8(&b, srcs[0]);
1728 break;
1729 case ir_unop_unpack_unorm_2x16:
1730 result = nir_unpack_unorm_2x16(&b, srcs[0]);
1731 break;
1732 case ir_unop_unpack_unorm_4x8:
1733 result = nir_unpack_unorm_4x8(&b, srcs[0]);
1734 break;
1735 case ir_unop_unpack_half_2x16:
1736 result = nir_unpack_half_2x16(&b, srcs[0]);
1737 break;
1738 case ir_unop_pack_sampler_2x32:
1739 case ir_unop_pack_image_2x32:
1740 case ir_unop_pack_double_2x32:
1741 case ir_unop_pack_int_2x32:
1742 case ir_unop_pack_uint_2x32:
1743 result = nir_pack_64_2x32(&b, srcs[0]);
1744 break;
1745 case ir_unop_unpack_sampler_2x32:
1746 case ir_unop_unpack_image_2x32:
1747 case ir_unop_unpack_double_2x32:
1748 case ir_unop_unpack_int_2x32:
1749 case ir_unop_unpack_uint_2x32:
1750 result = nir_unpack_64_2x32(&b, srcs[0]);
1751 break;
1752 case ir_unop_bitfield_reverse:
1753 result = nir_bitfield_reverse(&b, srcs[0]);
1754 break;
1755 case ir_unop_bit_count:
1756 result = nir_bit_count(&b, srcs[0]);
1757 break;
1758 case ir_unop_find_msb:
1759 switch (types[0]) {
1760 case GLSL_TYPE_UINT:
1761 result = nir_ufind_msb(&b, srcs[0]);
1762 break;
1763 case GLSL_TYPE_INT:
1764 result = nir_ifind_msb(&b, srcs[0]);
1765 break;
1766 default:
1767 unreachable("Invalid type for findMSB()");
1768 }
1769 break;
1770 case ir_unop_find_lsb:
1771 result = nir_find_lsb(&b, srcs[0]);
1772 break;
1773
1774 case ir_unop_noise:
1775 switch (ir->type->vector_elements) {
1776 case 1:
1777 switch (ir->operands[0]->type->vector_elements) {
1778 case 1: result = nir_fnoise1_1(&b, srcs[0]); break;
1779 case 2: result = nir_fnoise1_2(&b, srcs[0]); break;
1780 case 3: result = nir_fnoise1_3(&b, srcs[0]); break;
1781 case 4: result = nir_fnoise1_4(&b, srcs[0]); break;
1782 default: unreachable("not reached");
1783 }
1784 break;
1785 case 2:
1786 switch (ir->operands[0]->type->vector_elements) {
1787 case 1: result = nir_fnoise2_1(&b, srcs[0]); break;
1788 case 2: result = nir_fnoise2_2(&b, srcs[0]); break;
1789 case 3: result = nir_fnoise2_3(&b, srcs[0]); break;
1790 case 4: result = nir_fnoise2_4(&b, srcs[0]); break;
1791 default: unreachable("not reached");
1792 }
1793 break;
1794 case 3:
1795 switch (ir->operands[0]->type->vector_elements) {
1796 case 1: result = nir_fnoise3_1(&b, srcs[0]); break;
1797 case 2: result = nir_fnoise3_2(&b, srcs[0]); break;
1798 case 3: result = nir_fnoise3_3(&b, srcs[0]); break;
1799 case 4: result = nir_fnoise3_4(&b, srcs[0]); break;
1800 default: unreachable("not reached");
1801 }
1802 break;
1803 case 4:
1804 switch (ir->operands[0]->type->vector_elements) {
1805 case 1: result = nir_fnoise4_1(&b, srcs[0]); break;
1806 case 2: result = nir_fnoise4_2(&b, srcs[0]); break;
1807 case 3: result = nir_fnoise4_3(&b, srcs[0]); break;
1808 case 4: result = nir_fnoise4_4(&b, srcs[0]); break;
1809 default: unreachable("not reached");
1810 }
1811 break;
1812 default:
1813 unreachable("not reached");
1814 }
1815 break;
1816 case ir_unop_get_buffer_size: {
1817 nir_intrinsic_instr *load = nir_intrinsic_instr_create(
1818 this->shader,
1819 nir_intrinsic_get_buffer_size);
1820 load->num_components = ir->type->vector_elements;
1821 load->src[0] = nir_src_for_ssa(evaluate_rvalue(ir->operands[0]));
1822 unsigned bit_size = glsl_get_bit_size(ir->type);
1823 add_instr(&load->instr, ir->type->vector_elements, bit_size);
1824 return;
1825 }
1826
1827 case ir_binop_add:
1828 result = type_is_float(out_type) ? nir_fadd(&b, srcs[0], srcs[1])
1829 : nir_iadd(&b, srcs[0], srcs[1]);
1830 break;
1831 case ir_binop_sub:
1832 result = type_is_float(out_type) ? nir_fsub(&b, srcs[0], srcs[1])
1833 : nir_isub(&b, srcs[0], srcs[1]);
1834 break;
1835 case ir_binop_mul:
1836 result = type_is_float(out_type) ? nir_fmul(&b, srcs[0], srcs[1])
1837 : nir_imul(&b, srcs[0], srcs[1]);
1838 break;
1839 case ir_binop_div:
1840 if (type_is_float(out_type))
1841 result = nir_fdiv(&b, srcs[0], srcs[1]);
1842 else if (type_is_signed(out_type))
1843 result = nir_idiv(&b, srcs[0], srcs[1]);
1844 else
1845 result = nir_udiv(&b, srcs[0], srcs[1]);
1846 break;
1847 case ir_binop_mod:
1848 result = type_is_float(out_type) ? nir_fmod(&b, srcs[0], srcs[1])
1849 : nir_umod(&b, srcs[0], srcs[1]);
1850 break;
1851 case ir_binop_min:
1852 if (type_is_float(out_type))
1853 result = nir_fmin(&b, srcs[0], srcs[1]);
1854 else if (type_is_signed(out_type))
1855 result = nir_imin(&b, srcs[0], srcs[1]);
1856 else
1857 result = nir_umin(&b, srcs[0], srcs[1]);
1858 break;
1859 case ir_binop_max:
1860 if (type_is_float(out_type))
1861 result = nir_fmax(&b, srcs[0], srcs[1]);
1862 else if (type_is_signed(out_type))
1863 result = nir_imax(&b, srcs[0], srcs[1]);
1864 else
1865 result = nir_umax(&b, srcs[0], srcs[1]);
1866 break;
1867 case ir_binop_pow: result = nir_fpow(&b, srcs[0], srcs[1]); break;
1868 case ir_binop_bit_and: result = nir_iand(&b, srcs[0], srcs[1]); break;
1869 case ir_binop_bit_or: result = nir_ior(&b, srcs[0], srcs[1]); break;
1870 case ir_binop_bit_xor: result = nir_ixor(&b, srcs[0], srcs[1]); break;
1871 case ir_binop_logic_and:
1872 result = supports_ints ? nir_iand(&b, srcs[0], srcs[1])
1873 : nir_fand(&b, srcs[0], srcs[1]);
1874 break;
1875 case ir_binop_logic_or:
1876 result = supports_ints ? nir_ior(&b, srcs[0], srcs[1])
1877 : nir_for(&b, srcs[0], srcs[1]);
1878 break;
1879 case ir_binop_logic_xor:
1880 result = supports_ints ? nir_ixor(&b, srcs[0], srcs[1])
1881 : nir_fxor(&b, srcs[0], srcs[1]);
1882 break;
1883 case ir_binop_lshift: result = nir_ishl(&b, srcs[0], srcs[1]); break;
1884 case ir_binop_rshift:
1885 result = (type_is_signed(out_type)) ? nir_ishr(&b, srcs[0], srcs[1])
1886 : nir_ushr(&b, srcs[0], srcs[1]);
1887 break;
1888 case ir_binop_imul_high:
1889 result = (out_type == GLSL_TYPE_INT) ? nir_imul_high(&b, srcs[0], srcs[1])
1890 : nir_umul_high(&b, srcs[0], srcs[1]);
1891 break;
1892 case ir_binop_carry: result = nir_uadd_carry(&b, srcs[0], srcs[1]); break;
1893 case ir_binop_borrow: result = nir_usub_borrow(&b, srcs[0], srcs[1]); break;
1894 case ir_binop_less:
1895 if (supports_ints) {
1896 if (type_is_float(types[0]))
1897 result = nir_flt(&b, srcs[0], srcs[1]);
1898 else if (type_is_signed(types[0]))
1899 result = nir_ilt(&b, srcs[0], srcs[1]);
1900 else
1901 result = nir_ult(&b, srcs[0], srcs[1]);
1902 } else {
1903 result = nir_slt(&b, srcs[0], srcs[1]);
1904 }
1905 break;
1906 case ir_binop_gequal:
1907 if (supports_ints) {
1908 if (type_is_float(types[0]))
1909 result = nir_fge(&b, srcs[0], srcs[1]);
1910 else if (type_is_signed(types[0]))
1911 result = nir_ige(&b, srcs[0], srcs[1]);
1912 else
1913 result = nir_uge(&b, srcs[0], srcs[1]);
1914 } else {
1915 result = nir_sge(&b, srcs[0], srcs[1]);
1916 }
1917 break;
1918 case ir_binop_equal:
1919 if (supports_ints) {
1920 if (type_is_float(types[0]))
1921 result = nir_feq(&b, srcs[0], srcs[1]);
1922 else
1923 result = nir_ieq(&b, srcs[0], srcs[1]);
1924 } else {
1925 result = nir_seq(&b, srcs[0], srcs[1]);
1926 }
1927 break;
1928 case ir_binop_nequal:
1929 if (supports_ints) {
1930 if (type_is_float(types[0]))
1931 result = nir_fne(&b, srcs[0], srcs[1]);
1932 else
1933 result = nir_ine(&b, srcs[0], srcs[1]);
1934 } else {
1935 result = nir_sne(&b, srcs[0], srcs[1]);
1936 }
1937 break;
1938 case ir_binop_all_equal:
1939 if (supports_ints) {
1940 if (type_is_float(types[0])) {
1941 switch (ir->operands[0]->type->vector_elements) {
1942 case 1: result = nir_feq(&b, srcs[0], srcs[1]); break;
1943 case 2: result = nir_ball_fequal2(&b, srcs[0], srcs[1]); break;
1944 case 3: result = nir_ball_fequal3(&b, srcs[0], srcs[1]); break;
1945 case 4: result = nir_ball_fequal4(&b, srcs[0], srcs[1]); break;
1946 default:
1947 unreachable("not reached");
1948 }
1949 } else {
1950 switch (ir->operands[0]->type->vector_elements) {
1951 case 1: result = nir_ieq(&b, srcs[0], srcs[1]); break;
1952 case 2: result = nir_ball_iequal2(&b, srcs[0], srcs[1]); break;
1953 case 3: result = nir_ball_iequal3(&b, srcs[0], srcs[1]); break;
1954 case 4: result = nir_ball_iequal4(&b, srcs[0], srcs[1]); break;
1955 default:
1956 unreachable("not reached");
1957 }
1958 }
1959 } else {
1960 switch (ir->operands[0]->type->vector_elements) {
1961 case 1: result = nir_seq(&b, srcs[0], srcs[1]); break;
1962 case 2: result = nir_fall_equal2(&b, srcs[0], srcs[1]); break;
1963 case 3: result = nir_fall_equal3(&b, srcs[0], srcs[1]); break;
1964 case 4: result = nir_fall_equal4(&b, srcs[0], srcs[1]); break;
1965 default:
1966 unreachable("not reached");
1967 }
1968 }
1969 break;
1970 case ir_binop_any_nequal:
1971 if (supports_ints) {
1972 if (type_is_float(types[0])) {
1973 switch (ir->operands[0]->type->vector_elements) {
1974 case 1: result = nir_fne(&b, srcs[0], srcs[1]); break;
1975 case 2: result = nir_bany_fnequal2(&b, srcs[0], srcs[1]); break;
1976 case 3: result = nir_bany_fnequal3(&b, srcs[0], srcs[1]); break;
1977 case 4: result = nir_bany_fnequal4(&b, srcs[0], srcs[1]); break;
1978 default:
1979 unreachable("not reached");
1980 }
1981 } else {
1982 switch (ir->operands[0]->type->vector_elements) {
1983 case 1: result = nir_ine(&b, srcs[0], srcs[1]); break;
1984 case 2: result = nir_bany_inequal2(&b, srcs[0], srcs[1]); break;
1985 case 3: result = nir_bany_inequal3(&b, srcs[0], srcs[1]); break;
1986 case 4: result = nir_bany_inequal4(&b, srcs[0], srcs[1]); break;
1987 default:
1988 unreachable("not reached");
1989 }
1990 }
1991 } else {
1992 switch (ir->operands[0]->type->vector_elements) {
1993 case 1: result = nir_sne(&b, srcs[0], srcs[1]); break;
1994 case 2: result = nir_fany_nequal2(&b, srcs[0], srcs[1]); break;
1995 case 3: result = nir_fany_nequal3(&b, srcs[0], srcs[1]); break;
1996 case 4: result = nir_fany_nequal4(&b, srcs[0], srcs[1]); break;
1997 default:
1998 unreachable("not reached");
1999 }
2000 }
2001 break;
2002 case ir_binop_dot:
2003 switch (ir->operands[0]->type->vector_elements) {
2004 case 2: result = nir_fdot2(&b, srcs[0], srcs[1]); break;
2005 case 3: result = nir_fdot3(&b, srcs[0], srcs[1]); break;
2006 case 4: result = nir_fdot4(&b, srcs[0], srcs[1]); break;
2007 default:
2008 unreachable("not reached");
2009 }
2010 break;
2011 case ir_binop_vector_extract: {
2012 result = nir_channel(&b, srcs[0], 0);
2013 for (unsigned i = 1; i < ir->operands[0]->type->vector_elements; i++) {
2014 nir_ssa_def *swizzled = nir_channel(&b, srcs[0], i);
2015 result = nir_bcsel(&b, nir_ieq(&b, srcs[1], nir_imm_int(&b, i)),
2016 swizzled, result);
2017 }
2018 break;
2019 }
2020
2021 case ir_binop_ldexp: result = nir_ldexp(&b, srcs[0], srcs[1]); break;
2022 case ir_triop_fma:
2023 result = nir_ffma(&b, srcs[0], srcs[1], srcs[2]);
2024 break;
2025 case ir_triop_lrp:
2026 result = nir_flrp(&b, srcs[0], srcs[1], srcs[2]);
2027 break;
2028 case ir_triop_csel:
2029 if (supports_ints)
2030 result = nir_bcsel(&b, srcs[0], srcs[1], srcs[2]);
2031 else
2032 result = nir_fcsel(&b, srcs[0], srcs[1], srcs[2]);
2033 break;
2034 case ir_triop_bitfield_extract:
2035 result = (out_type == GLSL_TYPE_INT) ?
2036 nir_ibitfield_extract(&b, srcs[0], srcs[1], srcs[2]) :
2037 nir_ubitfield_extract(&b, srcs[0], srcs[1], srcs[2]);
2038 break;
2039 case ir_quadop_bitfield_insert:
2040 result = nir_bitfield_insert(&b, srcs[0], srcs[1], srcs[2], srcs[3]);
2041 break;
2042 case ir_quadop_vector:
2043 result = nir_vec(&b, srcs, ir->type->vector_elements);
2044 break;
2045
2046 default:
2047 unreachable("not reached");
2048 }
2049 }
2050
2051 void
2052 nir_visitor::visit(ir_swizzle *ir)
2053 {
2054 unsigned swizzle[4] = { ir->mask.x, ir->mask.y, ir->mask.z, ir->mask.w };
2055 result = nir_swizzle(&b, evaluate_rvalue(ir->val), swizzle,
2056 ir->type->vector_elements, !supports_ints);
2057 }
2058
2059 void
2060 nir_visitor::visit(ir_texture *ir)
2061 {
2062 unsigned num_srcs;
2063 nir_texop op;
2064 switch (ir->op) {
2065 case ir_tex:
2066 op = nir_texop_tex;
2067 num_srcs = 1; /* coordinate */
2068 break;
2069
2070 case ir_txb:
2071 case ir_txl:
2072 op = (ir->op == ir_txb) ? nir_texop_txb : nir_texop_txl;
2073 num_srcs = 2; /* coordinate, bias/lod */
2074 break;
2075
2076 case ir_txd:
2077 op = nir_texop_txd; /* coordinate, dPdx, dPdy */
2078 num_srcs = 3;
2079 break;
2080
2081 case ir_txf:
2082 op = nir_texop_txf;
2083 if (ir->lod_info.lod != NULL)
2084 num_srcs = 2; /* coordinate, lod */
2085 else
2086 num_srcs = 1; /* coordinate */
2087 break;
2088
2089 case ir_txf_ms:
2090 op = nir_texop_txf_ms;
2091 num_srcs = 2; /* coordinate, sample_index */
2092 break;
2093
2094 case ir_txs:
2095 op = nir_texop_txs;
2096 if (ir->lod_info.lod != NULL)
2097 num_srcs = 1; /* lod */
2098 else
2099 num_srcs = 0;
2100 break;
2101
2102 case ir_lod:
2103 op = nir_texop_lod;
2104 num_srcs = 1; /* coordinate */
2105 break;
2106
2107 case ir_tg4:
2108 op = nir_texop_tg4;
2109 num_srcs = 1; /* coordinate */
2110 break;
2111
2112 case ir_query_levels:
2113 op = nir_texop_query_levels;
2114 num_srcs = 0;
2115 break;
2116
2117 case ir_texture_samples:
2118 op = nir_texop_texture_samples;
2119 num_srcs = 0;
2120 break;
2121
2122 case ir_samples_identical:
2123 op = nir_texop_samples_identical;
2124 num_srcs = 1; /* coordinate */
2125 break;
2126
2127 default:
2128 unreachable("not reached");
2129 }
2130
2131 if (ir->projector != NULL)
2132 num_srcs++;
2133 if (ir->shadow_comparator != NULL)
2134 num_srcs++;
2135 if (ir->offset != NULL)
2136 num_srcs++;
2137
2138 /* Add one for the texture deref */
2139 num_srcs += 2;
2140
2141 nir_tex_instr *instr = nir_tex_instr_create(this->shader, num_srcs);
2142
2143 instr->op = op;
2144 instr->sampler_dim =
2145 (glsl_sampler_dim) ir->sampler->type->sampler_dimensionality;
2146 instr->is_array = ir->sampler->type->sampler_array;
2147 instr->is_shadow = ir->sampler->type->sampler_shadow;
2148 if (instr->is_shadow)
2149 instr->is_new_style_shadow = (ir->type->vector_elements == 1);
2150 switch (ir->type->base_type) {
2151 case GLSL_TYPE_FLOAT:
2152 instr->dest_type = nir_type_float;
2153 break;
2154 case GLSL_TYPE_INT:
2155 instr->dest_type = nir_type_int;
2156 break;
2157 case GLSL_TYPE_BOOL:
2158 case GLSL_TYPE_UINT:
2159 instr->dest_type = nir_type_uint;
2160 break;
2161 default:
2162 unreachable("not reached");
2163 }
2164
2165 nir_deref_instr *sampler_deref = evaluate_deref(ir->sampler);
2166 instr->src[0].src = nir_src_for_ssa(&sampler_deref->dest.ssa);
2167 instr->src[0].src_type = nir_tex_src_texture_deref;
2168 instr->src[1].src = nir_src_for_ssa(&sampler_deref->dest.ssa);
2169 instr->src[1].src_type = nir_tex_src_sampler_deref;
2170
2171 unsigned src_number = 2;
2172
2173 if (ir->coordinate != NULL) {
2174 instr->coord_components = ir->coordinate->type->vector_elements;
2175 instr->src[src_number].src =
2176 nir_src_for_ssa(evaluate_rvalue(ir->coordinate));
2177 instr->src[src_number].src_type = nir_tex_src_coord;
2178 src_number++;
2179 }
2180
2181 if (ir->projector != NULL) {
2182 instr->src[src_number].src =
2183 nir_src_for_ssa(evaluate_rvalue(ir->projector));
2184 instr->src[src_number].src_type = nir_tex_src_projector;
2185 src_number++;
2186 }
2187
2188 if (ir->shadow_comparator != NULL) {
2189 instr->src[src_number].src =
2190 nir_src_for_ssa(evaluate_rvalue(ir->shadow_comparator));
2191 instr->src[src_number].src_type = nir_tex_src_comparator;
2192 src_number++;
2193 }
2194
2195 if (ir->offset != NULL) {
2196 /* we don't support multiple offsets yet */
2197 assert(ir->offset->type->is_vector() || ir->offset->type->is_scalar());
2198
2199 instr->src[src_number].src =
2200 nir_src_for_ssa(evaluate_rvalue(ir->offset));
2201 instr->src[src_number].src_type = nir_tex_src_offset;
2202 src_number++;
2203 }
2204
2205 switch (ir->op) {
2206 case ir_txb:
2207 instr->src[src_number].src =
2208 nir_src_for_ssa(evaluate_rvalue(ir->lod_info.bias));
2209 instr->src[src_number].src_type = nir_tex_src_bias;
2210 src_number++;
2211 break;
2212
2213 case ir_txl:
2214 case ir_txf:
2215 case ir_txs:
2216 if (ir->lod_info.lod != NULL) {
2217 instr->src[src_number].src =
2218 nir_src_for_ssa(evaluate_rvalue(ir->lod_info.lod));
2219 instr->src[src_number].src_type = nir_tex_src_lod;
2220 src_number++;
2221 }
2222 break;
2223
2224 case ir_txd:
2225 instr->src[src_number].src =
2226 nir_src_for_ssa(evaluate_rvalue(ir->lod_info.grad.dPdx));
2227 instr->src[src_number].src_type = nir_tex_src_ddx;
2228 src_number++;
2229 instr->src[src_number].src =
2230 nir_src_for_ssa(evaluate_rvalue(ir->lod_info.grad.dPdy));
2231 instr->src[src_number].src_type = nir_tex_src_ddy;
2232 src_number++;
2233 break;
2234
2235 case ir_txf_ms:
2236 instr->src[src_number].src =
2237 nir_src_for_ssa(evaluate_rvalue(ir->lod_info.sample_index));
2238 instr->src[src_number].src_type = nir_tex_src_ms_index;
2239 src_number++;
2240 break;
2241
2242 case ir_tg4:
2243 instr->component = ir->lod_info.component->as_constant()->value.u[0];
2244 break;
2245
2246 default:
2247 break;
2248 }
2249
2250 assert(src_number == num_srcs);
2251
2252 unsigned bit_size = glsl_get_bit_size(ir->type);
2253 add_instr(&instr->instr, nir_tex_instr_dest_size(instr), bit_size);
2254 }
2255
2256 void
2257 nir_visitor::visit(ir_constant *ir)
2258 {
2259 /*
2260 * We don't know if this variable is an array or struct that gets
2261 * dereferenced, so do the safe thing an make it a variable with a
2262 * constant initializer and return a dereference.
2263 */
2264
2265 nir_variable *var =
2266 nir_local_variable_create(this->impl, ir->type, "const_temp");
2267 var->data.read_only = true;
2268 var->constant_initializer = constant_copy(ir, var);
2269
2270 this->deref = nir_build_deref_var(&b, var);
2271 }
2272
2273 void
2274 nir_visitor::visit(ir_dereference_variable *ir)
2275 {
2276 if (ir->variable_referenced()->data.mode == ir_var_function_out) {
2277 unsigned i = (sig->return_type != glsl_type::void_type) ? 1 : 0;
2278
2279 foreach_in_list(ir_variable, param, &sig->parameters) {
2280 if (param == ir->variable_referenced()) {
2281 break;
2282 }
2283 i++;
2284 }
2285
2286 this->deref = nir_build_deref_cast(&b, nir_load_param(&b, i),
2287 nir_var_function, ir->type, 0);
2288 return;
2289 }
2290
2291 assert(ir->variable_referenced()->data.mode != ir_var_function_inout);
2292
2293 struct hash_entry *entry =
2294 _mesa_hash_table_search(this->var_table, ir->var);
2295 assert(entry);
2296 nir_variable *var = (nir_variable *) entry->data;
2297
2298 this->deref = nir_build_deref_var(&b, var);
2299 }
2300
2301 void
2302 nir_visitor::visit(ir_dereference_record *ir)
2303 {
2304 ir->record->accept(this);
2305
2306 int field_index = ir->field_idx;
2307 assert(field_index >= 0);
2308
2309 this->deref = nir_build_deref_struct(&b, this->deref, field_index);
2310 }
2311
2312 void
2313 nir_visitor::visit(ir_dereference_array *ir)
2314 {
2315 nir_ssa_def *index = evaluate_rvalue(ir->array_index);
2316
2317 ir->array->accept(this);
2318
2319 this->deref = nir_build_deref_array(&b, this->deref, index);
2320 }
2321
2322 void
2323 nir_visitor::visit(ir_barrier *)
2324 {
2325 nir_intrinsic_instr *instr =
2326 nir_intrinsic_instr_create(this->shader, nir_intrinsic_barrier);
2327 nir_builder_instr_insert(&b, &instr->instr);
2328 }