nir: Tag entrypoint for easy recognition by nir_shader_get_entrypoint()
[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 if (strcmp(ir->function_name(), "main") == 0)
482 func->is_entrypoint = true;
483
484 func->num_params = ir->parameters.length() +
485 (ir->return_type != glsl_type::void_type);
486 func->params = ralloc_array(shader, nir_parameter, func->num_params);
487
488 unsigned np = 0;
489
490 if (ir->return_type != glsl_type::void_type) {
491 /* The return value is a variable deref (basically an out parameter) */
492 func->params[np].num_components = 1;
493 func->params[np].bit_size = 32;
494 np++;
495 }
496
497 foreach_in_list(ir_variable, param, &ir->parameters) {
498 /* FINISHME: pass arrays, structs, etc by reference? */
499 assert(param->type->is_vector() || param->type->is_scalar());
500
501 if (param->data.mode == ir_var_function_in) {
502 func->params[np].num_components = param->type->vector_elements;
503 func->params[np].bit_size = glsl_get_bit_size(param->type);
504 } else {
505 func->params[np].num_components = 1;
506 func->params[np].bit_size = 32;
507 }
508 np++;
509 }
510 assert(np == func->num_params);
511
512 _mesa_hash_table_insert(this->overload_table, ir, func);
513 }
514
515 void
516 nir_visitor::visit(ir_function *ir)
517 {
518 foreach_in_list(ir_function_signature, sig, &ir->signatures)
519 sig->accept(this);
520 }
521
522 void
523 nir_visitor::visit(ir_function_signature *ir)
524 {
525 if (ir->is_intrinsic())
526 return;
527
528 this->sig = ir;
529
530 struct hash_entry *entry =
531 _mesa_hash_table_search(this->overload_table, ir);
532
533 assert(entry);
534 nir_function *func = (nir_function *) entry->data;
535
536 if (ir->is_defined) {
537 nir_function_impl *impl = nir_function_impl_create(func);
538 this->impl = impl;
539
540 this->is_global = false;
541
542 nir_builder_init(&b, impl);
543 b.cursor = nir_after_cf_list(&impl->body);
544
545 unsigned i = (ir->return_type != glsl_type::void_type) ? 1 : 0;
546
547 foreach_in_list(ir_variable, param, &ir->parameters) {
548 nir_variable *var =
549 nir_local_variable_create(impl, param->type, param->name);
550
551 if (param->data.mode == ir_var_function_in) {
552 nir_store_var(&b, var, nir_load_param(&b, i), ~0);
553 }
554
555 _mesa_hash_table_insert(var_table, param, var);
556 i++;
557 }
558
559 visit_exec_list(&ir->body, this);
560
561 this->is_global = true;
562 } else {
563 func->impl = NULL;
564 }
565 }
566
567 void
568 nir_visitor::visit(ir_loop *ir)
569 {
570 nir_push_loop(&b);
571 visit_exec_list(&ir->body_instructions, this);
572 nir_pop_loop(&b, NULL);
573 }
574
575 void
576 nir_visitor::visit(ir_if *ir)
577 {
578 nir_push_if(&b, evaluate_rvalue(ir->condition));
579 visit_exec_list(&ir->then_instructions, this);
580 nir_push_else(&b, NULL);
581 visit_exec_list(&ir->else_instructions, this);
582 nir_pop_if(&b, NULL);
583 }
584
585 void
586 nir_visitor::visit(ir_discard *ir)
587 {
588 /*
589 * discards aren't treated as control flow, because before we lower them
590 * they can appear anywhere in the shader and the stuff after them may still
591 * be executed (yay, crazy GLSL rules!). However, after lowering, all the
592 * discards will be immediately followed by a return.
593 */
594
595 nir_intrinsic_instr *discard;
596 if (ir->condition) {
597 discard = nir_intrinsic_instr_create(this->shader,
598 nir_intrinsic_discard_if);
599 discard->src[0] =
600 nir_src_for_ssa(evaluate_rvalue(ir->condition));
601 } else {
602 discard = nir_intrinsic_instr_create(this->shader, nir_intrinsic_discard);
603 }
604
605 nir_builder_instr_insert(&b, &discard->instr);
606 }
607
608 void
609 nir_visitor::visit(ir_emit_vertex *ir)
610 {
611 nir_intrinsic_instr *instr =
612 nir_intrinsic_instr_create(this->shader, nir_intrinsic_emit_vertex);
613 nir_intrinsic_set_stream_id(instr, ir->stream_id());
614 nir_builder_instr_insert(&b, &instr->instr);
615 }
616
617 void
618 nir_visitor::visit(ir_end_primitive *ir)
619 {
620 nir_intrinsic_instr *instr =
621 nir_intrinsic_instr_create(this->shader, nir_intrinsic_end_primitive);
622 nir_intrinsic_set_stream_id(instr, ir->stream_id());
623 nir_builder_instr_insert(&b, &instr->instr);
624 }
625
626 void
627 nir_visitor::visit(ir_loop_jump *ir)
628 {
629 nir_jump_type type;
630 switch (ir->mode) {
631 case ir_loop_jump::jump_break:
632 type = nir_jump_break;
633 break;
634 case ir_loop_jump::jump_continue:
635 type = nir_jump_continue;
636 break;
637 default:
638 unreachable("not reached");
639 }
640
641 nir_jump_instr *instr = nir_jump_instr_create(this->shader, type);
642 nir_builder_instr_insert(&b, &instr->instr);
643 }
644
645 void
646 nir_visitor::visit(ir_return *ir)
647 {
648 if (ir->value != NULL) {
649 nir_deref_instr *ret_deref =
650 nir_build_deref_cast(&b, nir_load_param(&b, 0),
651 nir_var_function, ir->value->type, 0);
652
653 nir_ssa_def *val = evaluate_rvalue(ir->value);
654 nir_store_deref(&b, ret_deref, val, ~0);
655 }
656
657 nir_jump_instr *instr = nir_jump_instr_create(this->shader, nir_jump_return);
658 nir_builder_instr_insert(&b, &instr->instr);
659 }
660
661 static void
662 intrinsic_set_std430_align(nir_intrinsic_instr *intrin, const glsl_type *type)
663 {
664 unsigned bit_size = type->is_boolean() ? 32 : glsl_get_bit_size(type);
665 unsigned pow2_components = util_next_power_of_two(type->vector_elements);
666 nir_intrinsic_set_align(intrin, (bit_size / 8) * pow2_components, 0);
667 }
668
669 void
670 nir_visitor::visit(ir_call *ir)
671 {
672 if (ir->callee->is_intrinsic()) {
673 nir_intrinsic_op op;
674
675 switch (ir->callee->intrinsic_id) {
676 case ir_intrinsic_atomic_counter_read:
677 op = nir_intrinsic_atomic_counter_read_deref;
678 break;
679 case ir_intrinsic_atomic_counter_increment:
680 op = nir_intrinsic_atomic_counter_inc_deref;
681 break;
682 case ir_intrinsic_atomic_counter_predecrement:
683 op = nir_intrinsic_atomic_counter_pre_dec_deref;
684 break;
685 case ir_intrinsic_atomic_counter_add:
686 op = nir_intrinsic_atomic_counter_add_deref;
687 break;
688 case ir_intrinsic_atomic_counter_and:
689 op = nir_intrinsic_atomic_counter_and_deref;
690 break;
691 case ir_intrinsic_atomic_counter_or:
692 op = nir_intrinsic_atomic_counter_or_deref;
693 break;
694 case ir_intrinsic_atomic_counter_xor:
695 op = nir_intrinsic_atomic_counter_xor_deref;
696 break;
697 case ir_intrinsic_atomic_counter_min:
698 op = nir_intrinsic_atomic_counter_min_deref;
699 break;
700 case ir_intrinsic_atomic_counter_max:
701 op = nir_intrinsic_atomic_counter_max_deref;
702 break;
703 case ir_intrinsic_atomic_counter_exchange:
704 op = nir_intrinsic_atomic_counter_exchange_deref;
705 break;
706 case ir_intrinsic_atomic_counter_comp_swap:
707 op = nir_intrinsic_atomic_counter_comp_swap_deref;
708 break;
709 case ir_intrinsic_image_load:
710 op = nir_intrinsic_image_deref_load;
711 break;
712 case ir_intrinsic_image_store:
713 op = nir_intrinsic_image_deref_store;
714 break;
715 case ir_intrinsic_image_atomic_add:
716 op = ir->return_deref->type->is_integer_32_64()
717 ? nir_intrinsic_image_deref_atomic_add
718 : nir_intrinsic_image_deref_atomic_fadd;
719 break;
720 case ir_intrinsic_image_atomic_min:
721 op = nir_intrinsic_image_deref_atomic_min;
722 break;
723 case ir_intrinsic_image_atomic_max:
724 op = nir_intrinsic_image_deref_atomic_max;
725 break;
726 case ir_intrinsic_image_atomic_and:
727 op = nir_intrinsic_image_deref_atomic_and;
728 break;
729 case ir_intrinsic_image_atomic_or:
730 op = nir_intrinsic_image_deref_atomic_or;
731 break;
732 case ir_intrinsic_image_atomic_xor:
733 op = nir_intrinsic_image_deref_atomic_xor;
734 break;
735 case ir_intrinsic_image_atomic_exchange:
736 op = nir_intrinsic_image_deref_atomic_exchange;
737 break;
738 case ir_intrinsic_image_atomic_comp_swap:
739 op = nir_intrinsic_image_deref_atomic_comp_swap;
740 break;
741 case ir_intrinsic_memory_barrier:
742 op = nir_intrinsic_memory_barrier;
743 break;
744 case ir_intrinsic_image_size:
745 op = nir_intrinsic_image_deref_size;
746 break;
747 case ir_intrinsic_image_samples:
748 op = nir_intrinsic_image_deref_samples;
749 break;
750 case ir_intrinsic_ssbo_store:
751 op = nir_intrinsic_store_ssbo;
752 break;
753 case ir_intrinsic_ssbo_load:
754 op = nir_intrinsic_load_ssbo;
755 break;
756 case ir_intrinsic_ssbo_atomic_add:
757 op = ir->return_deref->type->is_integer_32_64()
758 ? nir_intrinsic_ssbo_atomic_add : nir_intrinsic_ssbo_atomic_fadd;
759 break;
760 case ir_intrinsic_ssbo_atomic_and:
761 op = nir_intrinsic_ssbo_atomic_and;
762 break;
763 case ir_intrinsic_ssbo_atomic_or:
764 op = nir_intrinsic_ssbo_atomic_or;
765 break;
766 case ir_intrinsic_ssbo_atomic_xor:
767 op = nir_intrinsic_ssbo_atomic_xor;
768 break;
769 case ir_intrinsic_ssbo_atomic_min:
770 assert(ir->return_deref);
771 if (ir->return_deref->type == glsl_type::int_type)
772 op = nir_intrinsic_ssbo_atomic_imin;
773 else if (ir->return_deref->type == glsl_type::uint_type)
774 op = nir_intrinsic_ssbo_atomic_umin;
775 else if (ir->return_deref->type == glsl_type::float_type)
776 op = nir_intrinsic_ssbo_atomic_fmin;
777 else
778 unreachable("Invalid type");
779 break;
780 case ir_intrinsic_ssbo_atomic_max:
781 assert(ir->return_deref);
782 if (ir->return_deref->type == glsl_type::int_type)
783 op = nir_intrinsic_ssbo_atomic_imax;
784 else if (ir->return_deref->type == glsl_type::uint_type)
785 op = nir_intrinsic_ssbo_atomic_umax;
786 else if (ir->return_deref->type == glsl_type::float_type)
787 op = nir_intrinsic_ssbo_atomic_fmax;
788 else
789 unreachable("Invalid type");
790 break;
791 case ir_intrinsic_ssbo_atomic_exchange:
792 op = nir_intrinsic_ssbo_atomic_exchange;
793 break;
794 case ir_intrinsic_ssbo_atomic_comp_swap:
795 op = ir->return_deref->type->is_integer_32_64()
796 ? nir_intrinsic_ssbo_atomic_comp_swap
797 : nir_intrinsic_ssbo_atomic_fcomp_swap;
798 break;
799 case ir_intrinsic_shader_clock:
800 op = nir_intrinsic_shader_clock;
801 break;
802 case ir_intrinsic_begin_invocation_interlock:
803 op = nir_intrinsic_begin_invocation_interlock;
804 break;
805 case ir_intrinsic_end_invocation_interlock:
806 op = nir_intrinsic_end_invocation_interlock;
807 break;
808 case ir_intrinsic_group_memory_barrier:
809 op = nir_intrinsic_group_memory_barrier;
810 break;
811 case ir_intrinsic_memory_barrier_atomic_counter:
812 op = nir_intrinsic_memory_barrier_atomic_counter;
813 break;
814 case ir_intrinsic_memory_barrier_buffer:
815 op = nir_intrinsic_memory_barrier_buffer;
816 break;
817 case ir_intrinsic_memory_barrier_image:
818 op = nir_intrinsic_memory_barrier_image;
819 break;
820 case ir_intrinsic_memory_barrier_shared:
821 op = nir_intrinsic_memory_barrier_shared;
822 break;
823 case ir_intrinsic_shared_load:
824 op = nir_intrinsic_load_shared;
825 break;
826 case ir_intrinsic_shared_store:
827 op = nir_intrinsic_store_shared;
828 break;
829 case ir_intrinsic_shared_atomic_add:
830 op = ir->return_deref->type->is_integer_32_64()
831 ? nir_intrinsic_shared_atomic_add
832 : nir_intrinsic_shared_atomic_fadd;
833 break;
834 case ir_intrinsic_shared_atomic_and:
835 op = nir_intrinsic_shared_atomic_and;
836 break;
837 case ir_intrinsic_shared_atomic_or:
838 op = nir_intrinsic_shared_atomic_or;
839 break;
840 case ir_intrinsic_shared_atomic_xor:
841 op = nir_intrinsic_shared_atomic_xor;
842 break;
843 case ir_intrinsic_shared_atomic_min:
844 assert(ir->return_deref);
845 if (ir->return_deref->type == glsl_type::int_type)
846 op = nir_intrinsic_shared_atomic_imin;
847 else if (ir->return_deref->type == glsl_type::uint_type)
848 op = nir_intrinsic_shared_atomic_umin;
849 else if (ir->return_deref->type == glsl_type::float_type)
850 op = nir_intrinsic_shared_atomic_fmin;
851 else
852 unreachable("Invalid type");
853 break;
854 case ir_intrinsic_shared_atomic_max:
855 assert(ir->return_deref);
856 if (ir->return_deref->type == glsl_type::int_type)
857 op = nir_intrinsic_shared_atomic_imax;
858 else if (ir->return_deref->type == glsl_type::uint_type)
859 op = nir_intrinsic_shared_atomic_umax;
860 else if (ir->return_deref->type == glsl_type::float_type)
861 op = nir_intrinsic_shared_atomic_fmax;
862 else
863 unreachable("Invalid type");
864 break;
865 case ir_intrinsic_shared_atomic_exchange:
866 op = nir_intrinsic_shared_atomic_exchange;
867 break;
868 case ir_intrinsic_shared_atomic_comp_swap:
869 op = ir->return_deref->type->is_integer_32_64()
870 ? nir_intrinsic_shared_atomic_comp_swap
871 : nir_intrinsic_shared_atomic_fcomp_swap;
872 break;
873 case ir_intrinsic_vote_any:
874 op = nir_intrinsic_vote_any;
875 break;
876 case ir_intrinsic_vote_all:
877 op = nir_intrinsic_vote_all;
878 break;
879 case ir_intrinsic_vote_eq:
880 op = nir_intrinsic_vote_ieq;
881 break;
882 case ir_intrinsic_ballot:
883 op = nir_intrinsic_ballot;
884 break;
885 case ir_intrinsic_read_invocation:
886 op = nir_intrinsic_read_invocation;
887 break;
888 case ir_intrinsic_read_first_invocation:
889 op = nir_intrinsic_read_first_invocation;
890 break;
891 default:
892 unreachable("not reached");
893 }
894
895 nir_intrinsic_instr *instr = nir_intrinsic_instr_create(shader, op);
896 nir_ssa_def *ret = &instr->dest.ssa;
897
898 switch (op) {
899 case nir_intrinsic_atomic_counter_read_deref:
900 case nir_intrinsic_atomic_counter_inc_deref:
901 case nir_intrinsic_atomic_counter_pre_dec_deref:
902 case nir_intrinsic_atomic_counter_add_deref:
903 case nir_intrinsic_atomic_counter_min_deref:
904 case nir_intrinsic_atomic_counter_max_deref:
905 case nir_intrinsic_atomic_counter_and_deref:
906 case nir_intrinsic_atomic_counter_or_deref:
907 case nir_intrinsic_atomic_counter_xor_deref:
908 case nir_intrinsic_atomic_counter_exchange_deref:
909 case nir_intrinsic_atomic_counter_comp_swap_deref: {
910 /* Set the counter variable dereference. */
911 exec_node *param = ir->actual_parameters.get_head();
912 ir_dereference *counter = (ir_dereference *)param;
913
914 instr->src[0] = nir_src_for_ssa(&evaluate_deref(counter)->dest.ssa);
915 param = param->get_next();
916
917 /* Set the intrinsic destination. */
918 if (ir->return_deref) {
919 nir_ssa_dest_init(&instr->instr, &instr->dest, 1, 32, NULL);
920 }
921
922 /* Set the intrinsic parameters. */
923 if (!param->is_tail_sentinel()) {
924 instr->src[1] =
925 nir_src_for_ssa(evaluate_rvalue((ir_dereference *)param));
926 param = param->get_next();
927 }
928
929 if (!param->is_tail_sentinel()) {
930 instr->src[2] =
931 nir_src_for_ssa(evaluate_rvalue((ir_dereference *)param));
932 param = param->get_next();
933 }
934
935 nir_builder_instr_insert(&b, &instr->instr);
936 break;
937 }
938 case nir_intrinsic_image_deref_load:
939 case nir_intrinsic_image_deref_store:
940 case nir_intrinsic_image_deref_atomic_add:
941 case nir_intrinsic_image_deref_atomic_min:
942 case nir_intrinsic_image_deref_atomic_max:
943 case nir_intrinsic_image_deref_atomic_and:
944 case nir_intrinsic_image_deref_atomic_or:
945 case nir_intrinsic_image_deref_atomic_xor:
946 case nir_intrinsic_image_deref_atomic_exchange:
947 case nir_intrinsic_image_deref_atomic_comp_swap:
948 case nir_intrinsic_image_deref_atomic_fadd:
949 case nir_intrinsic_image_deref_samples:
950 case nir_intrinsic_image_deref_size: {
951 nir_ssa_undef_instr *instr_undef =
952 nir_ssa_undef_instr_create(shader, 1, 32);
953 nir_builder_instr_insert(&b, &instr_undef->instr);
954
955 /* Set the image variable dereference. */
956 exec_node *param = ir->actual_parameters.get_head();
957 ir_dereference *image = (ir_dereference *)param;
958 const glsl_type *type =
959 image->variable_referenced()->type->without_array();
960
961 instr->src[0] = nir_src_for_ssa(&evaluate_deref(image)->dest.ssa);
962 param = param->get_next();
963
964 /* Set the intrinsic destination. */
965 if (ir->return_deref) {
966 unsigned num_components = ir->return_deref->type->vector_elements;
967 nir_ssa_dest_init(&instr->instr, &instr->dest,
968 num_components, 32, NULL);
969 }
970
971 if (op == nir_intrinsic_image_deref_size) {
972 instr->num_components = instr->dest.ssa.num_components;
973 } else if (op == nir_intrinsic_image_deref_load ||
974 op == nir_intrinsic_image_deref_store) {
975 instr->num_components = 4;
976 }
977
978 if (op == nir_intrinsic_image_deref_size ||
979 op == nir_intrinsic_image_deref_samples) {
980 nir_builder_instr_insert(&b, &instr->instr);
981 break;
982 }
983
984 /* Set the address argument, extending the coordinate vector to four
985 * components.
986 */
987 nir_ssa_def *src_addr =
988 evaluate_rvalue((ir_dereference *)param);
989 nir_ssa_def *srcs[4];
990
991 for (int i = 0; i < 4; i++) {
992 if (i < type->coordinate_components())
993 srcs[i] = nir_channel(&b, src_addr, i);
994 else
995 srcs[i] = &instr_undef->def;
996 }
997
998 instr->src[1] = nir_src_for_ssa(nir_vec(&b, srcs, 4));
999 param = param->get_next();
1000
1001 /* Set the sample argument, which is undefined for single-sample
1002 * images.
1003 */
1004 if (type->sampler_dimensionality == GLSL_SAMPLER_DIM_MS) {
1005 instr->src[2] =
1006 nir_src_for_ssa(evaluate_rvalue((ir_dereference *)param));
1007 param = param->get_next();
1008 } else {
1009 instr->src[2] = nir_src_for_ssa(&instr_undef->def);
1010 }
1011
1012 /* Set the intrinsic parameters. */
1013 if (!param->is_tail_sentinel()) {
1014 instr->src[3] =
1015 nir_src_for_ssa(evaluate_rvalue((ir_dereference *)param));
1016 param = param->get_next();
1017 }
1018
1019 if (!param->is_tail_sentinel()) {
1020 instr->src[4] =
1021 nir_src_for_ssa(evaluate_rvalue((ir_dereference *)param));
1022 param = param->get_next();
1023 }
1024 nir_builder_instr_insert(&b, &instr->instr);
1025 break;
1026 }
1027 case nir_intrinsic_memory_barrier:
1028 case nir_intrinsic_group_memory_barrier:
1029 case nir_intrinsic_memory_barrier_atomic_counter:
1030 case nir_intrinsic_memory_barrier_buffer:
1031 case nir_intrinsic_memory_barrier_image:
1032 case nir_intrinsic_memory_barrier_shared:
1033 nir_builder_instr_insert(&b, &instr->instr);
1034 break;
1035 case nir_intrinsic_shader_clock:
1036 nir_ssa_dest_init(&instr->instr, &instr->dest, 2, 32, NULL);
1037 instr->num_components = 2;
1038 nir_builder_instr_insert(&b, &instr->instr);
1039 break;
1040 case nir_intrinsic_begin_invocation_interlock:
1041 nir_builder_instr_insert(&b, &instr->instr);
1042 break;
1043 case nir_intrinsic_end_invocation_interlock:
1044 nir_builder_instr_insert(&b, &instr->instr);
1045 break;
1046 case nir_intrinsic_store_ssbo: {
1047 exec_node *param = ir->actual_parameters.get_head();
1048 ir_rvalue *block = ((ir_instruction *)param)->as_rvalue();
1049
1050 param = param->get_next();
1051 ir_rvalue *offset = ((ir_instruction *)param)->as_rvalue();
1052
1053 param = param->get_next();
1054 ir_rvalue *val = ((ir_instruction *)param)->as_rvalue();
1055
1056 param = param->get_next();
1057 ir_constant *write_mask = ((ir_instruction *)param)->as_constant();
1058 assert(write_mask);
1059
1060 nir_ssa_def *nir_val = evaluate_rvalue(val);
1061 if (val->type->is_boolean())
1062 nir_val = nir_b2i32(&b, nir_val);
1063
1064 instr->src[0] = nir_src_for_ssa(nir_val);
1065 instr->src[1] = nir_src_for_ssa(evaluate_rvalue(block));
1066 instr->src[2] = nir_src_for_ssa(evaluate_rvalue(offset));
1067 intrinsic_set_std430_align(instr, val->type);
1068 nir_intrinsic_set_write_mask(instr, write_mask->value.u[0]);
1069 instr->num_components = val->type->vector_elements;
1070
1071 nir_builder_instr_insert(&b, &instr->instr);
1072 break;
1073 }
1074 case nir_intrinsic_load_ssbo: {
1075 exec_node *param = ir->actual_parameters.get_head();
1076 ir_rvalue *block = ((ir_instruction *)param)->as_rvalue();
1077
1078 param = param->get_next();
1079 ir_rvalue *offset = ((ir_instruction *)param)->as_rvalue();
1080
1081 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(block));
1082 instr->src[1] = nir_src_for_ssa(evaluate_rvalue(offset));
1083
1084 const glsl_type *type = ir->return_deref->var->type;
1085 instr->num_components = type->vector_elements;
1086 intrinsic_set_std430_align(instr, type);
1087
1088 /* Setup destination register */
1089 unsigned bit_size = type->is_boolean() ? 32 : glsl_get_bit_size(type);
1090 nir_ssa_dest_init(&instr->instr, &instr->dest,
1091 type->vector_elements, bit_size, NULL);
1092
1093 /* Insert the created nir instruction now since in the case of boolean
1094 * result we will need to emit another instruction after it
1095 */
1096 nir_builder_instr_insert(&b, &instr->instr);
1097
1098 /*
1099 * In SSBO/UBO's, a true boolean value is any non-zero value, but we
1100 * consider a true boolean to be ~0. Fix this up with a != 0
1101 * comparison.
1102 */
1103 if (type->is_boolean())
1104 ret = nir_i2b(&b, &instr->dest.ssa);
1105 break;
1106 }
1107 case nir_intrinsic_ssbo_atomic_add:
1108 case nir_intrinsic_ssbo_atomic_imin:
1109 case nir_intrinsic_ssbo_atomic_umin:
1110 case nir_intrinsic_ssbo_atomic_imax:
1111 case nir_intrinsic_ssbo_atomic_umax:
1112 case nir_intrinsic_ssbo_atomic_and:
1113 case nir_intrinsic_ssbo_atomic_or:
1114 case nir_intrinsic_ssbo_atomic_xor:
1115 case nir_intrinsic_ssbo_atomic_exchange:
1116 case nir_intrinsic_ssbo_atomic_comp_swap:
1117 case nir_intrinsic_ssbo_atomic_fadd:
1118 case nir_intrinsic_ssbo_atomic_fmin:
1119 case nir_intrinsic_ssbo_atomic_fmax:
1120 case nir_intrinsic_ssbo_atomic_fcomp_swap: {
1121 int param_count = ir->actual_parameters.length();
1122 assert(param_count == 3 || param_count == 4);
1123
1124 /* Block index */
1125 exec_node *param = ir->actual_parameters.get_head();
1126 ir_instruction *inst = (ir_instruction *) param;
1127 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
1128
1129 /* Offset */
1130 param = param->get_next();
1131 inst = (ir_instruction *) param;
1132 instr->src[1] = nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
1133
1134 /* data1 parameter (this is always present) */
1135 param = param->get_next();
1136 inst = (ir_instruction *) param;
1137 instr->src[2] = nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
1138
1139 /* data2 parameter (only with atomic_comp_swap) */
1140 if (param_count == 4) {
1141 assert(op == nir_intrinsic_ssbo_atomic_comp_swap ||
1142 op == nir_intrinsic_ssbo_atomic_fcomp_swap);
1143 param = param->get_next();
1144 inst = (ir_instruction *) param;
1145 instr->src[3] = nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
1146 }
1147
1148 /* Atomic result */
1149 assert(ir->return_deref);
1150 nir_ssa_dest_init(&instr->instr, &instr->dest,
1151 ir->return_deref->type->vector_elements, 32, NULL);
1152 nir_builder_instr_insert(&b, &instr->instr);
1153 break;
1154 }
1155 case nir_intrinsic_load_shared: {
1156 exec_node *param = ir->actual_parameters.get_head();
1157 ir_rvalue *offset = ((ir_instruction *)param)->as_rvalue();
1158
1159 nir_intrinsic_set_base(instr, 0);
1160 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(offset));
1161
1162 const glsl_type *type = ir->return_deref->var->type;
1163 instr->num_components = type->vector_elements;
1164 intrinsic_set_std430_align(instr, type);
1165
1166 /* Setup destination register */
1167 unsigned bit_size = type->is_boolean() ? 32 : glsl_get_bit_size(type);
1168 nir_ssa_dest_init(&instr->instr, &instr->dest,
1169 type->vector_elements, bit_size, NULL);
1170
1171 nir_builder_instr_insert(&b, &instr->instr);
1172
1173 /* The value in shared memory is a 32-bit value */
1174 if (type->is_boolean())
1175 ret = nir_i2b(&b, &instr->dest.ssa);
1176 break;
1177 }
1178 case nir_intrinsic_store_shared: {
1179 exec_node *param = ir->actual_parameters.get_head();
1180 ir_rvalue *offset = ((ir_instruction *)param)->as_rvalue();
1181
1182 param = param->get_next();
1183 ir_rvalue *val = ((ir_instruction *)param)->as_rvalue();
1184
1185 param = param->get_next();
1186 ir_constant *write_mask = ((ir_instruction *)param)->as_constant();
1187 assert(write_mask);
1188
1189 nir_intrinsic_set_base(instr, 0);
1190 instr->src[1] = nir_src_for_ssa(evaluate_rvalue(offset));
1191
1192 nir_intrinsic_set_write_mask(instr, write_mask->value.u[0]);
1193
1194 nir_ssa_def *nir_val = evaluate_rvalue(val);
1195 /* The value in shared memory is a 32-bit value */
1196 if (val->type->is_boolean())
1197 nir_val = nir_b2i32(&b, nir_val);
1198
1199 instr->src[0] = nir_src_for_ssa(nir_val);
1200 instr->num_components = val->type->vector_elements;
1201 intrinsic_set_std430_align(instr, val->type);
1202
1203 nir_builder_instr_insert(&b, &instr->instr);
1204 break;
1205 }
1206 case nir_intrinsic_shared_atomic_add:
1207 case nir_intrinsic_shared_atomic_imin:
1208 case nir_intrinsic_shared_atomic_umin:
1209 case nir_intrinsic_shared_atomic_imax:
1210 case nir_intrinsic_shared_atomic_umax:
1211 case nir_intrinsic_shared_atomic_and:
1212 case nir_intrinsic_shared_atomic_or:
1213 case nir_intrinsic_shared_atomic_xor:
1214 case nir_intrinsic_shared_atomic_exchange:
1215 case nir_intrinsic_shared_atomic_comp_swap:
1216 case nir_intrinsic_shared_atomic_fadd:
1217 case nir_intrinsic_shared_atomic_fmin:
1218 case nir_intrinsic_shared_atomic_fmax:
1219 case nir_intrinsic_shared_atomic_fcomp_swap: {
1220 int param_count = ir->actual_parameters.length();
1221 assert(param_count == 2 || param_count == 3);
1222
1223 /* Offset */
1224 exec_node *param = ir->actual_parameters.get_head();
1225 ir_instruction *inst = (ir_instruction *) param;
1226 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
1227
1228 /* data1 parameter (this is always present) */
1229 param = param->get_next();
1230 inst = (ir_instruction *) param;
1231 instr->src[1] = nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
1232
1233 /* data2 parameter (only with atomic_comp_swap) */
1234 if (param_count == 3) {
1235 assert(op == nir_intrinsic_shared_atomic_comp_swap ||
1236 op == nir_intrinsic_shared_atomic_fcomp_swap);
1237 param = param->get_next();
1238 inst = (ir_instruction *) param;
1239 instr->src[2] =
1240 nir_src_for_ssa(evaluate_rvalue(inst->as_rvalue()));
1241 }
1242
1243 /* Atomic result */
1244 assert(ir->return_deref);
1245 unsigned bit_size = glsl_get_bit_size(ir->return_deref->type);
1246 nir_ssa_dest_init(&instr->instr, &instr->dest,
1247 ir->return_deref->type->vector_elements,
1248 bit_size, NULL);
1249 nir_builder_instr_insert(&b, &instr->instr);
1250 break;
1251 }
1252 case nir_intrinsic_vote_any:
1253 case nir_intrinsic_vote_all:
1254 case nir_intrinsic_vote_ieq: {
1255 nir_ssa_dest_init(&instr->instr, &instr->dest, 1, 1, NULL);
1256 instr->num_components = 1;
1257
1258 ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
1259 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(value));
1260
1261 nir_builder_instr_insert(&b, &instr->instr);
1262 break;
1263 }
1264
1265 case nir_intrinsic_ballot: {
1266 nir_ssa_dest_init(&instr->instr, &instr->dest,
1267 ir->return_deref->type->vector_elements, 64, NULL);
1268 instr->num_components = ir->return_deref->type->vector_elements;
1269
1270 ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
1271 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(value));
1272
1273 nir_builder_instr_insert(&b, &instr->instr);
1274 break;
1275 }
1276 case nir_intrinsic_read_invocation: {
1277 nir_ssa_dest_init(&instr->instr, &instr->dest,
1278 ir->return_deref->type->vector_elements, 32, NULL);
1279 instr->num_components = ir->return_deref->type->vector_elements;
1280
1281 ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
1282 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(value));
1283
1284 ir_rvalue *invocation = (ir_rvalue *) ir->actual_parameters.get_head()->next;
1285 instr->src[1] = nir_src_for_ssa(evaluate_rvalue(invocation));
1286
1287 nir_builder_instr_insert(&b, &instr->instr);
1288 break;
1289 }
1290 case nir_intrinsic_read_first_invocation: {
1291 nir_ssa_dest_init(&instr->instr, &instr->dest,
1292 ir->return_deref->type->vector_elements, 32, NULL);
1293 instr->num_components = ir->return_deref->type->vector_elements;
1294
1295 ir_rvalue *value = (ir_rvalue *) ir->actual_parameters.get_head();
1296 instr->src[0] = nir_src_for_ssa(evaluate_rvalue(value));
1297
1298 nir_builder_instr_insert(&b, &instr->instr);
1299 break;
1300 }
1301 default:
1302 unreachable("not reached");
1303 }
1304
1305 if (ir->return_deref)
1306 nir_store_deref(&b, evaluate_deref(ir->return_deref), ret, ~0);
1307
1308 return;
1309 }
1310
1311 struct hash_entry *entry =
1312 _mesa_hash_table_search(this->overload_table, ir->callee);
1313 assert(entry);
1314 nir_function *callee = (nir_function *) entry->data;
1315
1316 nir_call_instr *call = nir_call_instr_create(this->shader, callee);
1317
1318 unsigned i = 0;
1319 nir_deref_instr *ret_deref = NULL;
1320 if (ir->return_deref) {
1321 nir_variable *ret_tmp =
1322 nir_local_variable_create(this->impl, ir->return_deref->type,
1323 "return_tmp");
1324 ret_deref = nir_build_deref_var(&b, ret_tmp);
1325 call->params[i++] = nir_src_for_ssa(&ret_deref->dest.ssa);
1326 }
1327
1328 foreach_two_lists(formal_node, &ir->callee->parameters,
1329 actual_node, &ir->actual_parameters) {
1330 ir_rvalue *param_rvalue = (ir_rvalue *) actual_node;
1331 ir_variable *sig_param = (ir_variable *) formal_node;
1332
1333 if (sig_param->data.mode == ir_var_function_out) {
1334 nir_deref_instr *out_deref = evaluate_deref(param_rvalue);
1335 call->params[i] = nir_src_for_ssa(&out_deref->dest.ssa);
1336 } else if (sig_param->data.mode == ir_var_function_in) {
1337 nir_ssa_def *val = evaluate_rvalue(param_rvalue);
1338 nir_src src = nir_src_for_ssa(val);
1339
1340 nir_src_copy(&call->params[i], &src, call);
1341 } else if (sig_param->data.mode == ir_var_function_inout) {
1342 unreachable("unimplemented: inout parameters");
1343 }
1344
1345 i++;
1346 }
1347
1348 nir_builder_instr_insert(&b, &call->instr);
1349
1350 if (ir->return_deref)
1351 nir_store_deref(&b, evaluate_deref(ir->return_deref), nir_load_deref(&b, ret_deref), ~0);
1352 }
1353
1354 void
1355 nir_visitor::visit(ir_assignment *ir)
1356 {
1357 unsigned num_components = ir->lhs->type->vector_elements;
1358
1359 b.exact = ir->lhs->variable_referenced()->data.invariant ||
1360 ir->lhs->variable_referenced()->data.precise;
1361
1362 if ((ir->rhs->as_dereference() || ir->rhs->as_constant()) &&
1363 (ir->write_mask == (1 << num_components) - 1 || ir->write_mask == 0)) {
1364 if (ir->condition) {
1365 nir_push_if(&b, evaluate_rvalue(ir->condition));
1366 nir_copy_deref(&b, evaluate_deref(ir->lhs), evaluate_deref(ir->rhs));
1367 nir_pop_if(&b, NULL);
1368 } else {
1369 nir_copy_deref(&b, evaluate_deref(ir->lhs), evaluate_deref(ir->rhs));
1370 }
1371 return;
1372 }
1373
1374 assert(ir->rhs->type->is_scalar() || ir->rhs->type->is_vector());
1375
1376 ir->lhs->accept(this);
1377 nir_deref_instr *lhs_deref = this->deref;
1378 nir_ssa_def *src = evaluate_rvalue(ir->rhs);
1379
1380 if (ir->write_mask != (1 << num_components) - 1 && ir->write_mask != 0) {
1381 /* GLSL IR will give us the input to the write-masked assignment in a
1382 * single packed vector. So, for example, if the writemask is xzw, then
1383 * we have to swizzle x -> x, y -> z, and z -> w and get the y component
1384 * from the load.
1385 */
1386 unsigned swiz[4];
1387 unsigned component = 0;
1388 for (unsigned i = 0; i < 4; i++) {
1389 swiz[i] = ir->write_mask & (1 << i) ? component++ : 0;
1390 }
1391 src = nir_swizzle(&b, src, swiz, num_components, !supports_ints);
1392 }
1393
1394 if (ir->condition) {
1395 nir_push_if(&b, evaluate_rvalue(ir->condition));
1396 nir_store_deref(&b, lhs_deref, src, ir->write_mask);
1397 nir_pop_if(&b, NULL);
1398 } else {
1399 nir_store_deref(&b, lhs_deref, src, ir->write_mask);
1400 }
1401 }
1402
1403 /*
1404 * Given an instruction, returns a pointer to its destination or NULL if there
1405 * is no destination.
1406 *
1407 * Note that this only handles instructions we generate at this level.
1408 */
1409 static nir_dest *
1410 get_instr_dest(nir_instr *instr)
1411 {
1412 nir_alu_instr *alu_instr;
1413 nir_intrinsic_instr *intrinsic_instr;
1414 nir_tex_instr *tex_instr;
1415
1416 switch (instr->type) {
1417 case nir_instr_type_alu:
1418 alu_instr = nir_instr_as_alu(instr);
1419 return &alu_instr->dest.dest;
1420
1421 case nir_instr_type_intrinsic:
1422 intrinsic_instr = nir_instr_as_intrinsic(instr);
1423 if (nir_intrinsic_infos[intrinsic_instr->intrinsic].has_dest)
1424 return &intrinsic_instr->dest;
1425 else
1426 return NULL;
1427
1428 case nir_instr_type_tex:
1429 tex_instr = nir_instr_as_tex(instr);
1430 return &tex_instr->dest;
1431
1432 default:
1433 unreachable("not reached");
1434 }
1435
1436 return NULL;
1437 }
1438
1439 void
1440 nir_visitor::add_instr(nir_instr *instr, unsigned num_components,
1441 unsigned bit_size)
1442 {
1443 nir_dest *dest = get_instr_dest(instr);
1444
1445 if (dest)
1446 nir_ssa_dest_init(instr, dest, num_components, bit_size, NULL);
1447
1448 nir_builder_instr_insert(&b, instr);
1449
1450 if (dest) {
1451 assert(dest->is_ssa);
1452 this->result = &dest->ssa;
1453 }
1454 }
1455
1456 nir_ssa_def *
1457 nir_visitor::evaluate_rvalue(ir_rvalue* ir)
1458 {
1459 ir->accept(this);
1460 if (ir->as_dereference() || ir->as_constant()) {
1461 /*
1462 * A dereference is being used on the right hand side, which means we
1463 * must emit a variable load.
1464 */
1465
1466 this->result = nir_load_deref(&b, this->deref);
1467 }
1468
1469 return this->result;
1470 }
1471
1472 static bool
1473 type_is_float(glsl_base_type type)
1474 {
1475 return type == GLSL_TYPE_FLOAT || type == GLSL_TYPE_DOUBLE ||
1476 type == GLSL_TYPE_FLOAT16;
1477 }
1478
1479 static bool
1480 type_is_signed(glsl_base_type type)
1481 {
1482 return type == GLSL_TYPE_INT || type == GLSL_TYPE_INT64 ||
1483 type == GLSL_TYPE_INT16;
1484 }
1485
1486 void
1487 nir_visitor::visit(ir_expression *ir)
1488 {
1489 /* Some special cases */
1490 switch (ir->operation) {
1491 case ir_binop_ubo_load: {
1492 nir_intrinsic_instr *load =
1493 nir_intrinsic_instr_create(this->shader, nir_intrinsic_load_ubo);
1494 unsigned bit_size = ir->type->is_boolean() ? 32 :
1495 glsl_get_bit_size(ir->type);
1496 load->num_components = ir->type->vector_elements;
1497 load->src[0] = nir_src_for_ssa(evaluate_rvalue(ir->operands[0]));
1498 load->src[1] = nir_src_for_ssa(evaluate_rvalue(ir->operands[1]));
1499 intrinsic_set_std430_align(load, ir->type);
1500 add_instr(&load->instr, ir->type->vector_elements, bit_size);
1501
1502 /*
1503 * In UBO's, a true boolean value is any non-zero value, but we consider
1504 * a true boolean to be ~0. Fix this up with a != 0 comparison.
1505 */
1506
1507 if (ir->type->is_boolean())
1508 this->result = nir_i2b(&b, &load->dest.ssa);
1509
1510 return;
1511 }
1512
1513 case ir_unop_interpolate_at_centroid:
1514 case ir_binop_interpolate_at_offset:
1515 case ir_binop_interpolate_at_sample: {
1516 ir_dereference *deref = ir->operands[0]->as_dereference();
1517 ir_swizzle *swizzle = NULL;
1518 if (!deref) {
1519 /* the api does not allow a swizzle here, but the varying packing code
1520 * may have pushed one into here.
1521 */
1522 swizzle = ir->operands[0]->as_swizzle();
1523 assert(swizzle);
1524 deref = swizzle->val->as_dereference();
1525 assert(deref);
1526 }
1527
1528 deref->accept(this);
1529
1530 nir_intrinsic_op op;
1531 if (this->deref->mode == nir_var_shader_in) {
1532 switch (ir->operation) {
1533 case ir_unop_interpolate_at_centroid:
1534 op = nir_intrinsic_interp_deref_at_centroid;
1535 break;
1536 case ir_binop_interpolate_at_offset:
1537 op = nir_intrinsic_interp_deref_at_offset;
1538 break;
1539 case ir_binop_interpolate_at_sample:
1540 op = nir_intrinsic_interp_deref_at_sample;
1541 break;
1542 default:
1543 unreachable("Invalid interpolation intrinsic");
1544 }
1545 } else {
1546 /* This case can happen if the vertex shader does not write the
1547 * given varying. In this case, the linker will lower it to a
1548 * global variable. Since interpolating a variable makes no
1549 * sense, we'll just turn it into a load which will probably
1550 * eventually end up as an SSA definition.
1551 */
1552 assert(this->deref->mode == nir_var_private);
1553 op = nir_intrinsic_load_deref;
1554 }
1555
1556 nir_intrinsic_instr *intrin = nir_intrinsic_instr_create(shader, op);
1557 intrin->num_components = deref->type->vector_elements;
1558 intrin->src[0] = nir_src_for_ssa(&this->deref->dest.ssa);
1559
1560 if (intrin->intrinsic == nir_intrinsic_interp_deref_at_offset ||
1561 intrin->intrinsic == nir_intrinsic_interp_deref_at_sample)
1562 intrin->src[1] = nir_src_for_ssa(evaluate_rvalue(ir->operands[1]));
1563
1564 unsigned bit_size = glsl_get_bit_size(deref->type);
1565 add_instr(&intrin->instr, deref->type->vector_elements, bit_size);
1566
1567 if (swizzle) {
1568 unsigned swiz[4] = {
1569 swizzle->mask.x, swizzle->mask.y, swizzle->mask.z, swizzle->mask.w
1570 };
1571
1572 result = nir_swizzle(&b, result, swiz,
1573 swizzle->type->vector_elements, false);
1574 }
1575
1576 return;
1577 }
1578
1579 default:
1580 break;
1581 }
1582
1583 nir_ssa_def *srcs[4];
1584 for (unsigned i = 0; i < ir->num_operands; i++)
1585 srcs[i] = evaluate_rvalue(ir->operands[i]);
1586
1587 glsl_base_type types[4];
1588 for (unsigned i = 0; i < ir->num_operands; i++)
1589 if (supports_ints)
1590 types[i] = ir->operands[i]->type->base_type;
1591 else
1592 types[i] = GLSL_TYPE_FLOAT;
1593
1594 glsl_base_type out_type;
1595 if (supports_ints)
1596 out_type = ir->type->base_type;
1597 else
1598 out_type = GLSL_TYPE_FLOAT;
1599
1600 switch (ir->operation) {
1601 case ir_unop_bit_not: result = nir_inot(&b, srcs[0]); break;
1602 case ir_unop_logic_not:
1603 result = supports_ints ? nir_inot(&b, srcs[0]) : nir_fnot(&b, srcs[0]);
1604 break;
1605 case ir_unop_neg:
1606 result = type_is_float(types[0]) ? nir_fneg(&b, srcs[0])
1607 : nir_ineg(&b, srcs[0]);
1608 break;
1609 case ir_unop_abs:
1610 result = type_is_float(types[0]) ? nir_fabs(&b, srcs[0])
1611 : nir_iabs(&b, srcs[0]);
1612 break;
1613 case ir_unop_saturate:
1614 assert(type_is_float(types[0]));
1615 result = nir_fsat(&b, srcs[0]);
1616 break;
1617 case ir_unop_sign:
1618 result = type_is_float(types[0]) ? nir_fsign(&b, srcs[0])
1619 : nir_isign(&b, srcs[0]);
1620 break;
1621 case ir_unop_rcp: result = nir_frcp(&b, srcs[0]); break;
1622 case ir_unop_rsq: result = nir_frsq(&b, srcs[0]); break;
1623 case ir_unop_sqrt: result = nir_fsqrt(&b, srcs[0]); break;
1624 case ir_unop_exp: unreachable("ir_unop_exp should have been lowered");
1625 case ir_unop_log: unreachable("ir_unop_log should have been lowered");
1626 case ir_unop_exp2: result = nir_fexp2(&b, srcs[0]); break;
1627 case ir_unop_log2: result = nir_flog2(&b, srcs[0]); break;
1628 case ir_unop_i2f:
1629 result = supports_ints ? nir_i2f32(&b, srcs[0]) : nir_fmov(&b, srcs[0]);
1630 break;
1631 case ir_unop_u2f:
1632 result = supports_ints ? nir_u2f32(&b, srcs[0]) : nir_fmov(&b, srcs[0]);
1633 break;
1634 case ir_unop_b2f:
1635 result = supports_ints ? nir_b2f32(&b, srcs[0]) : nir_fmov(&b, srcs[0]);
1636 break;
1637 case ir_unop_f2i:
1638 case ir_unop_f2u:
1639 case ir_unop_f2b:
1640 case ir_unop_i2b:
1641 case ir_unop_b2i:
1642 case ir_unop_b2i64:
1643 case ir_unop_d2f:
1644 case ir_unop_f2d:
1645 case ir_unop_d2i:
1646 case ir_unop_d2u:
1647 case ir_unop_d2b:
1648 case ir_unop_i2d:
1649 case ir_unop_u2d:
1650 case ir_unop_i642i:
1651 case ir_unop_i642u:
1652 case ir_unop_i642f:
1653 case ir_unop_i642b:
1654 case ir_unop_i642d:
1655 case ir_unop_u642i:
1656 case ir_unop_u642u:
1657 case ir_unop_u642f:
1658 case ir_unop_u642d:
1659 case ir_unop_i2i64:
1660 case ir_unop_u2i64:
1661 case ir_unop_f2i64:
1662 case ir_unop_d2i64:
1663 case ir_unop_i2u64:
1664 case ir_unop_u2u64:
1665 case ir_unop_f2u64:
1666 case ir_unop_d2u64:
1667 case ir_unop_i2u:
1668 case ir_unop_u2i:
1669 case ir_unop_i642u64:
1670 case ir_unop_u642i64: {
1671 nir_alu_type src_type = nir_get_nir_type_for_glsl_base_type(types[0]);
1672 nir_alu_type dst_type = nir_get_nir_type_for_glsl_base_type(out_type);
1673 result = nir_build_alu(&b, nir_type_conversion_op(src_type, dst_type,
1674 nir_rounding_mode_undef),
1675 srcs[0], NULL, NULL, NULL);
1676 /* b2i and b2f don't have fixed bit-size versions so the builder will
1677 * just assume 32 and we have to fix it up here.
1678 */
1679 result->bit_size = nir_alu_type_get_type_size(dst_type);
1680 break;
1681 }
1682
1683 case ir_unop_bitcast_i2f:
1684 case ir_unop_bitcast_f2i:
1685 case ir_unop_bitcast_u2f:
1686 case ir_unop_bitcast_f2u:
1687 case ir_unop_bitcast_i642d:
1688 case ir_unop_bitcast_d2i64:
1689 case ir_unop_bitcast_u642d:
1690 case ir_unop_bitcast_d2u64:
1691 case ir_unop_subroutine_to_int:
1692 /* no-op */
1693 result = nir_imov(&b, srcs[0]);
1694 break;
1695 case ir_unop_trunc: result = nir_ftrunc(&b, srcs[0]); break;
1696 case ir_unop_ceil: result = nir_fceil(&b, srcs[0]); break;
1697 case ir_unop_floor: result = nir_ffloor(&b, srcs[0]); break;
1698 case ir_unop_fract: result = nir_ffract(&b, srcs[0]); break;
1699 case ir_unop_frexp_exp: result = nir_frexp_exp(&b, srcs[0]); break;
1700 case ir_unop_frexp_sig: result = nir_frexp_sig(&b, srcs[0]); break;
1701 case ir_unop_round_even: result = nir_fround_even(&b, srcs[0]); break;
1702 case ir_unop_sin: result = nir_fsin(&b, srcs[0]); break;
1703 case ir_unop_cos: result = nir_fcos(&b, srcs[0]); break;
1704 case ir_unop_dFdx: result = nir_fddx(&b, srcs[0]); break;
1705 case ir_unop_dFdy: result = nir_fddy(&b, srcs[0]); break;
1706 case ir_unop_dFdx_fine: result = nir_fddx_fine(&b, srcs[0]); break;
1707 case ir_unop_dFdy_fine: result = nir_fddy_fine(&b, srcs[0]); break;
1708 case ir_unop_dFdx_coarse: result = nir_fddx_coarse(&b, srcs[0]); break;
1709 case ir_unop_dFdy_coarse: result = nir_fddy_coarse(&b, srcs[0]); break;
1710 case ir_unop_pack_snorm_2x16:
1711 result = nir_pack_snorm_2x16(&b, srcs[0]);
1712 break;
1713 case ir_unop_pack_snorm_4x8:
1714 result = nir_pack_snorm_4x8(&b, srcs[0]);
1715 break;
1716 case ir_unop_pack_unorm_2x16:
1717 result = nir_pack_unorm_2x16(&b, srcs[0]);
1718 break;
1719 case ir_unop_pack_unorm_4x8:
1720 result = nir_pack_unorm_4x8(&b, srcs[0]);
1721 break;
1722 case ir_unop_pack_half_2x16:
1723 result = nir_pack_half_2x16(&b, srcs[0]);
1724 break;
1725 case ir_unop_unpack_snorm_2x16:
1726 result = nir_unpack_snorm_2x16(&b, srcs[0]);
1727 break;
1728 case ir_unop_unpack_snorm_4x8:
1729 result = nir_unpack_snorm_4x8(&b, srcs[0]);
1730 break;
1731 case ir_unop_unpack_unorm_2x16:
1732 result = nir_unpack_unorm_2x16(&b, srcs[0]);
1733 break;
1734 case ir_unop_unpack_unorm_4x8:
1735 result = nir_unpack_unorm_4x8(&b, srcs[0]);
1736 break;
1737 case ir_unop_unpack_half_2x16:
1738 result = nir_unpack_half_2x16(&b, srcs[0]);
1739 break;
1740 case ir_unop_pack_sampler_2x32:
1741 case ir_unop_pack_image_2x32:
1742 case ir_unop_pack_double_2x32:
1743 case ir_unop_pack_int_2x32:
1744 case ir_unop_pack_uint_2x32:
1745 result = nir_pack_64_2x32(&b, srcs[0]);
1746 break;
1747 case ir_unop_unpack_sampler_2x32:
1748 case ir_unop_unpack_image_2x32:
1749 case ir_unop_unpack_double_2x32:
1750 case ir_unop_unpack_int_2x32:
1751 case ir_unop_unpack_uint_2x32:
1752 result = nir_unpack_64_2x32(&b, srcs[0]);
1753 break;
1754 case ir_unop_bitfield_reverse:
1755 result = nir_bitfield_reverse(&b, srcs[0]);
1756 break;
1757 case ir_unop_bit_count:
1758 result = nir_bit_count(&b, srcs[0]);
1759 break;
1760 case ir_unop_find_msb:
1761 switch (types[0]) {
1762 case GLSL_TYPE_UINT:
1763 result = nir_ufind_msb(&b, srcs[0]);
1764 break;
1765 case GLSL_TYPE_INT:
1766 result = nir_ifind_msb(&b, srcs[0]);
1767 break;
1768 default:
1769 unreachable("Invalid type for findMSB()");
1770 }
1771 break;
1772 case ir_unop_find_lsb:
1773 result = nir_find_lsb(&b, srcs[0]);
1774 break;
1775
1776 case ir_unop_noise:
1777 switch (ir->type->vector_elements) {
1778 case 1:
1779 switch (ir->operands[0]->type->vector_elements) {
1780 case 1: result = nir_fnoise1_1(&b, srcs[0]); break;
1781 case 2: result = nir_fnoise1_2(&b, srcs[0]); break;
1782 case 3: result = nir_fnoise1_3(&b, srcs[0]); break;
1783 case 4: result = nir_fnoise1_4(&b, srcs[0]); break;
1784 default: unreachable("not reached");
1785 }
1786 break;
1787 case 2:
1788 switch (ir->operands[0]->type->vector_elements) {
1789 case 1: result = nir_fnoise2_1(&b, srcs[0]); break;
1790 case 2: result = nir_fnoise2_2(&b, srcs[0]); break;
1791 case 3: result = nir_fnoise2_3(&b, srcs[0]); break;
1792 case 4: result = nir_fnoise2_4(&b, srcs[0]); break;
1793 default: unreachable("not reached");
1794 }
1795 break;
1796 case 3:
1797 switch (ir->operands[0]->type->vector_elements) {
1798 case 1: result = nir_fnoise3_1(&b, srcs[0]); break;
1799 case 2: result = nir_fnoise3_2(&b, srcs[0]); break;
1800 case 3: result = nir_fnoise3_3(&b, srcs[0]); break;
1801 case 4: result = nir_fnoise3_4(&b, srcs[0]); break;
1802 default: unreachable("not reached");
1803 }
1804 break;
1805 case 4:
1806 switch (ir->operands[0]->type->vector_elements) {
1807 case 1: result = nir_fnoise4_1(&b, srcs[0]); break;
1808 case 2: result = nir_fnoise4_2(&b, srcs[0]); break;
1809 case 3: result = nir_fnoise4_3(&b, srcs[0]); break;
1810 case 4: result = nir_fnoise4_4(&b, srcs[0]); break;
1811 default: unreachable("not reached");
1812 }
1813 break;
1814 default:
1815 unreachable("not reached");
1816 }
1817 break;
1818 case ir_unop_get_buffer_size: {
1819 nir_intrinsic_instr *load = nir_intrinsic_instr_create(
1820 this->shader,
1821 nir_intrinsic_get_buffer_size);
1822 load->num_components = ir->type->vector_elements;
1823 load->src[0] = nir_src_for_ssa(evaluate_rvalue(ir->operands[0]));
1824 unsigned bit_size = glsl_get_bit_size(ir->type);
1825 add_instr(&load->instr, ir->type->vector_elements, bit_size);
1826 return;
1827 }
1828
1829 case ir_binop_add:
1830 result = type_is_float(out_type) ? nir_fadd(&b, srcs[0], srcs[1])
1831 : nir_iadd(&b, srcs[0], srcs[1]);
1832 break;
1833 case ir_binop_sub:
1834 result = type_is_float(out_type) ? nir_fsub(&b, srcs[0], srcs[1])
1835 : nir_isub(&b, srcs[0], srcs[1]);
1836 break;
1837 case ir_binop_mul:
1838 result = type_is_float(out_type) ? nir_fmul(&b, srcs[0], srcs[1])
1839 : nir_imul(&b, srcs[0], srcs[1]);
1840 break;
1841 case ir_binop_div:
1842 if (type_is_float(out_type))
1843 result = nir_fdiv(&b, srcs[0], srcs[1]);
1844 else if (type_is_signed(out_type))
1845 result = nir_idiv(&b, srcs[0], srcs[1]);
1846 else
1847 result = nir_udiv(&b, srcs[0], srcs[1]);
1848 break;
1849 case ir_binop_mod:
1850 result = type_is_float(out_type) ? nir_fmod(&b, srcs[0], srcs[1])
1851 : nir_umod(&b, srcs[0], srcs[1]);
1852 break;
1853 case ir_binop_min:
1854 if (type_is_float(out_type))
1855 result = nir_fmin(&b, srcs[0], srcs[1]);
1856 else if (type_is_signed(out_type))
1857 result = nir_imin(&b, srcs[0], srcs[1]);
1858 else
1859 result = nir_umin(&b, srcs[0], srcs[1]);
1860 break;
1861 case ir_binop_max:
1862 if (type_is_float(out_type))
1863 result = nir_fmax(&b, srcs[0], srcs[1]);
1864 else if (type_is_signed(out_type))
1865 result = nir_imax(&b, srcs[0], srcs[1]);
1866 else
1867 result = nir_umax(&b, srcs[0], srcs[1]);
1868 break;
1869 case ir_binop_pow: result = nir_fpow(&b, srcs[0], srcs[1]); break;
1870 case ir_binop_bit_and: result = nir_iand(&b, srcs[0], srcs[1]); break;
1871 case ir_binop_bit_or: result = nir_ior(&b, srcs[0], srcs[1]); break;
1872 case ir_binop_bit_xor: result = nir_ixor(&b, srcs[0], srcs[1]); break;
1873 case ir_binop_logic_and:
1874 result = supports_ints ? nir_iand(&b, srcs[0], srcs[1])
1875 : nir_fand(&b, srcs[0], srcs[1]);
1876 break;
1877 case ir_binop_logic_or:
1878 result = supports_ints ? nir_ior(&b, srcs[0], srcs[1])
1879 : nir_for(&b, srcs[0], srcs[1]);
1880 break;
1881 case ir_binop_logic_xor:
1882 result = supports_ints ? nir_ixor(&b, srcs[0], srcs[1])
1883 : nir_fxor(&b, srcs[0], srcs[1]);
1884 break;
1885 case ir_binop_lshift: result = nir_ishl(&b, srcs[0], srcs[1]); break;
1886 case ir_binop_rshift:
1887 result = (type_is_signed(out_type)) ? nir_ishr(&b, srcs[0], srcs[1])
1888 : nir_ushr(&b, srcs[0], srcs[1]);
1889 break;
1890 case ir_binop_imul_high:
1891 result = (out_type == GLSL_TYPE_INT) ? nir_imul_high(&b, srcs[0], srcs[1])
1892 : nir_umul_high(&b, srcs[0], srcs[1]);
1893 break;
1894 case ir_binop_carry: result = nir_uadd_carry(&b, srcs[0], srcs[1]); break;
1895 case ir_binop_borrow: result = nir_usub_borrow(&b, srcs[0], srcs[1]); break;
1896 case ir_binop_less:
1897 if (supports_ints) {
1898 if (type_is_float(types[0]))
1899 result = nir_flt(&b, srcs[0], srcs[1]);
1900 else if (type_is_signed(types[0]))
1901 result = nir_ilt(&b, srcs[0], srcs[1]);
1902 else
1903 result = nir_ult(&b, srcs[0], srcs[1]);
1904 } else {
1905 result = nir_slt(&b, srcs[0], srcs[1]);
1906 }
1907 break;
1908 case ir_binop_gequal:
1909 if (supports_ints) {
1910 if (type_is_float(types[0]))
1911 result = nir_fge(&b, srcs[0], srcs[1]);
1912 else if (type_is_signed(types[0]))
1913 result = nir_ige(&b, srcs[0], srcs[1]);
1914 else
1915 result = nir_uge(&b, srcs[0], srcs[1]);
1916 } else {
1917 result = nir_sge(&b, srcs[0], srcs[1]);
1918 }
1919 break;
1920 case ir_binop_equal:
1921 if (supports_ints) {
1922 if (type_is_float(types[0]))
1923 result = nir_feq(&b, srcs[0], srcs[1]);
1924 else
1925 result = nir_ieq(&b, srcs[0], srcs[1]);
1926 } else {
1927 result = nir_seq(&b, srcs[0], srcs[1]);
1928 }
1929 break;
1930 case ir_binop_nequal:
1931 if (supports_ints) {
1932 if (type_is_float(types[0]))
1933 result = nir_fne(&b, srcs[0], srcs[1]);
1934 else
1935 result = nir_ine(&b, srcs[0], srcs[1]);
1936 } else {
1937 result = nir_sne(&b, srcs[0], srcs[1]);
1938 }
1939 break;
1940 case ir_binop_all_equal:
1941 if (supports_ints) {
1942 if (type_is_float(types[0])) {
1943 switch (ir->operands[0]->type->vector_elements) {
1944 case 1: result = nir_feq(&b, srcs[0], srcs[1]); break;
1945 case 2: result = nir_ball_fequal2(&b, srcs[0], srcs[1]); break;
1946 case 3: result = nir_ball_fequal3(&b, srcs[0], srcs[1]); break;
1947 case 4: result = nir_ball_fequal4(&b, srcs[0], srcs[1]); break;
1948 default:
1949 unreachable("not reached");
1950 }
1951 } else {
1952 switch (ir->operands[0]->type->vector_elements) {
1953 case 1: result = nir_ieq(&b, srcs[0], srcs[1]); break;
1954 case 2: result = nir_ball_iequal2(&b, srcs[0], srcs[1]); break;
1955 case 3: result = nir_ball_iequal3(&b, srcs[0], srcs[1]); break;
1956 case 4: result = nir_ball_iequal4(&b, srcs[0], srcs[1]); break;
1957 default:
1958 unreachable("not reached");
1959 }
1960 }
1961 } else {
1962 switch (ir->operands[0]->type->vector_elements) {
1963 case 1: result = nir_seq(&b, srcs[0], srcs[1]); break;
1964 case 2: result = nir_fall_equal2(&b, srcs[0], srcs[1]); break;
1965 case 3: result = nir_fall_equal3(&b, srcs[0], srcs[1]); break;
1966 case 4: result = nir_fall_equal4(&b, srcs[0], srcs[1]); break;
1967 default:
1968 unreachable("not reached");
1969 }
1970 }
1971 break;
1972 case ir_binop_any_nequal:
1973 if (supports_ints) {
1974 if (type_is_float(types[0])) {
1975 switch (ir->operands[0]->type->vector_elements) {
1976 case 1: result = nir_fne(&b, srcs[0], srcs[1]); break;
1977 case 2: result = nir_bany_fnequal2(&b, srcs[0], srcs[1]); break;
1978 case 3: result = nir_bany_fnequal3(&b, srcs[0], srcs[1]); break;
1979 case 4: result = nir_bany_fnequal4(&b, srcs[0], srcs[1]); break;
1980 default:
1981 unreachable("not reached");
1982 }
1983 } else {
1984 switch (ir->operands[0]->type->vector_elements) {
1985 case 1: result = nir_ine(&b, srcs[0], srcs[1]); break;
1986 case 2: result = nir_bany_inequal2(&b, srcs[0], srcs[1]); break;
1987 case 3: result = nir_bany_inequal3(&b, srcs[0], srcs[1]); break;
1988 case 4: result = nir_bany_inequal4(&b, srcs[0], srcs[1]); break;
1989 default:
1990 unreachable("not reached");
1991 }
1992 }
1993 } else {
1994 switch (ir->operands[0]->type->vector_elements) {
1995 case 1: result = nir_sne(&b, srcs[0], srcs[1]); break;
1996 case 2: result = nir_fany_nequal2(&b, srcs[0], srcs[1]); break;
1997 case 3: result = nir_fany_nequal3(&b, srcs[0], srcs[1]); break;
1998 case 4: result = nir_fany_nequal4(&b, srcs[0], srcs[1]); break;
1999 default:
2000 unreachable("not reached");
2001 }
2002 }
2003 break;
2004 case ir_binop_dot:
2005 switch (ir->operands[0]->type->vector_elements) {
2006 case 2: result = nir_fdot2(&b, srcs[0], srcs[1]); break;
2007 case 3: result = nir_fdot3(&b, srcs[0], srcs[1]); break;
2008 case 4: result = nir_fdot4(&b, srcs[0], srcs[1]); break;
2009 default:
2010 unreachable("not reached");
2011 }
2012 break;
2013 case ir_binop_vector_extract: {
2014 result = nir_channel(&b, srcs[0], 0);
2015 for (unsigned i = 1; i < ir->operands[0]->type->vector_elements; i++) {
2016 nir_ssa_def *swizzled = nir_channel(&b, srcs[0], i);
2017 result = nir_bcsel(&b, nir_ieq(&b, srcs[1], nir_imm_int(&b, i)),
2018 swizzled, result);
2019 }
2020 break;
2021 }
2022
2023 case ir_binop_ldexp: result = nir_ldexp(&b, srcs[0], srcs[1]); break;
2024 case ir_triop_fma:
2025 result = nir_ffma(&b, srcs[0], srcs[1], srcs[2]);
2026 break;
2027 case ir_triop_lrp:
2028 result = nir_flrp(&b, srcs[0], srcs[1], srcs[2]);
2029 break;
2030 case ir_triop_csel:
2031 if (supports_ints)
2032 result = nir_bcsel(&b, srcs[0], srcs[1], srcs[2]);
2033 else
2034 result = nir_fcsel(&b, srcs[0], srcs[1], srcs[2]);
2035 break;
2036 case ir_triop_bitfield_extract:
2037 result = (out_type == GLSL_TYPE_INT) ?
2038 nir_ibitfield_extract(&b, srcs[0], srcs[1], srcs[2]) :
2039 nir_ubitfield_extract(&b, srcs[0], srcs[1], srcs[2]);
2040 break;
2041 case ir_quadop_bitfield_insert:
2042 result = nir_bitfield_insert(&b, srcs[0], srcs[1], srcs[2], srcs[3]);
2043 break;
2044 case ir_quadop_vector:
2045 result = nir_vec(&b, srcs, ir->type->vector_elements);
2046 break;
2047
2048 default:
2049 unreachable("not reached");
2050 }
2051 }
2052
2053 void
2054 nir_visitor::visit(ir_swizzle *ir)
2055 {
2056 unsigned swizzle[4] = { ir->mask.x, ir->mask.y, ir->mask.z, ir->mask.w };
2057 result = nir_swizzle(&b, evaluate_rvalue(ir->val), swizzle,
2058 ir->type->vector_elements, !supports_ints);
2059 }
2060
2061 void
2062 nir_visitor::visit(ir_texture *ir)
2063 {
2064 unsigned num_srcs;
2065 nir_texop op;
2066 switch (ir->op) {
2067 case ir_tex:
2068 op = nir_texop_tex;
2069 num_srcs = 1; /* coordinate */
2070 break;
2071
2072 case ir_txb:
2073 case ir_txl:
2074 op = (ir->op == ir_txb) ? nir_texop_txb : nir_texop_txl;
2075 num_srcs = 2; /* coordinate, bias/lod */
2076 break;
2077
2078 case ir_txd:
2079 op = nir_texop_txd; /* coordinate, dPdx, dPdy */
2080 num_srcs = 3;
2081 break;
2082
2083 case ir_txf:
2084 op = nir_texop_txf;
2085 if (ir->lod_info.lod != NULL)
2086 num_srcs = 2; /* coordinate, lod */
2087 else
2088 num_srcs = 1; /* coordinate */
2089 break;
2090
2091 case ir_txf_ms:
2092 op = nir_texop_txf_ms;
2093 num_srcs = 2; /* coordinate, sample_index */
2094 break;
2095
2096 case ir_txs:
2097 op = nir_texop_txs;
2098 if (ir->lod_info.lod != NULL)
2099 num_srcs = 1; /* lod */
2100 else
2101 num_srcs = 0;
2102 break;
2103
2104 case ir_lod:
2105 op = nir_texop_lod;
2106 num_srcs = 1; /* coordinate */
2107 break;
2108
2109 case ir_tg4:
2110 op = nir_texop_tg4;
2111 num_srcs = 1; /* coordinate */
2112 break;
2113
2114 case ir_query_levels:
2115 op = nir_texop_query_levels;
2116 num_srcs = 0;
2117 break;
2118
2119 case ir_texture_samples:
2120 op = nir_texop_texture_samples;
2121 num_srcs = 0;
2122 break;
2123
2124 case ir_samples_identical:
2125 op = nir_texop_samples_identical;
2126 num_srcs = 1; /* coordinate */
2127 break;
2128
2129 default:
2130 unreachable("not reached");
2131 }
2132
2133 if (ir->projector != NULL)
2134 num_srcs++;
2135 if (ir->shadow_comparator != NULL)
2136 num_srcs++;
2137 if (ir->offset != NULL)
2138 num_srcs++;
2139
2140 /* Add one for the texture deref */
2141 num_srcs += 2;
2142
2143 nir_tex_instr *instr = nir_tex_instr_create(this->shader, num_srcs);
2144
2145 instr->op = op;
2146 instr->sampler_dim =
2147 (glsl_sampler_dim) ir->sampler->type->sampler_dimensionality;
2148 instr->is_array = ir->sampler->type->sampler_array;
2149 instr->is_shadow = ir->sampler->type->sampler_shadow;
2150 if (instr->is_shadow)
2151 instr->is_new_style_shadow = (ir->type->vector_elements == 1);
2152 switch (ir->type->base_type) {
2153 case GLSL_TYPE_FLOAT:
2154 instr->dest_type = nir_type_float;
2155 break;
2156 case GLSL_TYPE_INT:
2157 instr->dest_type = nir_type_int;
2158 break;
2159 case GLSL_TYPE_BOOL:
2160 case GLSL_TYPE_UINT:
2161 instr->dest_type = nir_type_uint;
2162 break;
2163 default:
2164 unreachable("not reached");
2165 }
2166
2167 nir_deref_instr *sampler_deref = evaluate_deref(ir->sampler);
2168 instr->src[0].src = nir_src_for_ssa(&sampler_deref->dest.ssa);
2169 instr->src[0].src_type = nir_tex_src_texture_deref;
2170 instr->src[1].src = nir_src_for_ssa(&sampler_deref->dest.ssa);
2171 instr->src[1].src_type = nir_tex_src_sampler_deref;
2172
2173 unsigned src_number = 2;
2174
2175 if (ir->coordinate != NULL) {
2176 instr->coord_components = ir->coordinate->type->vector_elements;
2177 instr->src[src_number].src =
2178 nir_src_for_ssa(evaluate_rvalue(ir->coordinate));
2179 instr->src[src_number].src_type = nir_tex_src_coord;
2180 src_number++;
2181 }
2182
2183 if (ir->projector != NULL) {
2184 instr->src[src_number].src =
2185 nir_src_for_ssa(evaluate_rvalue(ir->projector));
2186 instr->src[src_number].src_type = nir_tex_src_projector;
2187 src_number++;
2188 }
2189
2190 if (ir->shadow_comparator != NULL) {
2191 instr->src[src_number].src =
2192 nir_src_for_ssa(evaluate_rvalue(ir->shadow_comparator));
2193 instr->src[src_number].src_type = nir_tex_src_comparator;
2194 src_number++;
2195 }
2196
2197 if (ir->offset != NULL) {
2198 /* we don't support multiple offsets yet */
2199 assert(ir->offset->type->is_vector() || ir->offset->type->is_scalar());
2200
2201 instr->src[src_number].src =
2202 nir_src_for_ssa(evaluate_rvalue(ir->offset));
2203 instr->src[src_number].src_type = nir_tex_src_offset;
2204 src_number++;
2205 }
2206
2207 switch (ir->op) {
2208 case ir_txb:
2209 instr->src[src_number].src =
2210 nir_src_for_ssa(evaluate_rvalue(ir->lod_info.bias));
2211 instr->src[src_number].src_type = nir_tex_src_bias;
2212 src_number++;
2213 break;
2214
2215 case ir_txl:
2216 case ir_txf:
2217 case ir_txs:
2218 if (ir->lod_info.lod != NULL) {
2219 instr->src[src_number].src =
2220 nir_src_for_ssa(evaluate_rvalue(ir->lod_info.lod));
2221 instr->src[src_number].src_type = nir_tex_src_lod;
2222 src_number++;
2223 }
2224 break;
2225
2226 case ir_txd:
2227 instr->src[src_number].src =
2228 nir_src_for_ssa(evaluate_rvalue(ir->lod_info.grad.dPdx));
2229 instr->src[src_number].src_type = nir_tex_src_ddx;
2230 src_number++;
2231 instr->src[src_number].src =
2232 nir_src_for_ssa(evaluate_rvalue(ir->lod_info.grad.dPdy));
2233 instr->src[src_number].src_type = nir_tex_src_ddy;
2234 src_number++;
2235 break;
2236
2237 case ir_txf_ms:
2238 instr->src[src_number].src =
2239 nir_src_for_ssa(evaluate_rvalue(ir->lod_info.sample_index));
2240 instr->src[src_number].src_type = nir_tex_src_ms_index;
2241 src_number++;
2242 break;
2243
2244 case ir_tg4:
2245 instr->component = ir->lod_info.component->as_constant()->value.u[0];
2246 break;
2247
2248 default:
2249 break;
2250 }
2251
2252 assert(src_number == num_srcs);
2253
2254 unsigned bit_size = glsl_get_bit_size(ir->type);
2255 add_instr(&instr->instr, nir_tex_instr_dest_size(instr), bit_size);
2256 }
2257
2258 void
2259 nir_visitor::visit(ir_constant *ir)
2260 {
2261 /*
2262 * We don't know if this variable is an array or struct that gets
2263 * dereferenced, so do the safe thing an make it a variable with a
2264 * constant initializer and return a dereference.
2265 */
2266
2267 nir_variable *var =
2268 nir_local_variable_create(this->impl, ir->type, "const_temp");
2269 var->data.read_only = true;
2270 var->constant_initializer = constant_copy(ir, var);
2271
2272 this->deref = nir_build_deref_var(&b, var);
2273 }
2274
2275 void
2276 nir_visitor::visit(ir_dereference_variable *ir)
2277 {
2278 if (ir->variable_referenced()->data.mode == ir_var_function_out) {
2279 unsigned i = (sig->return_type != glsl_type::void_type) ? 1 : 0;
2280
2281 foreach_in_list(ir_variable, param, &sig->parameters) {
2282 if (param == ir->variable_referenced()) {
2283 break;
2284 }
2285 i++;
2286 }
2287
2288 this->deref = nir_build_deref_cast(&b, nir_load_param(&b, i),
2289 nir_var_function, ir->type, 0);
2290 return;
2291 }
2292
2293 assert(ir->variable_referenced()->data.mode != ir_var_function_inout);
2294
2295 struct hash_entry *entry =
2296 _mesa_hash_table_search(this->var_table, ir->var);
2297 assert(entry);
2298 nir_variable *var = (nir_variable *) entry->data;
2299
2300 this->deref = nir_build_deref_var(&b, var);
2301 }
2302
2303 void
2304 nir_visitor::visit(ir_dereference_record *ir)
2305 {
2306 ir->record->accept(this);
2307
2308 int field_index = ir->field_idx;
2309 assert(field_index >= 0);
2310
2311 this->deref = nir_build_deref_struct(&b, this->deref, field_index);
2312 }
2313
2314 void
2315 nir_visitor::visit(ir_dereference_array *ir)
2316 {
2317 nir_ssa_def *index = evaluate_rvalue(ir->array_index);
2318
2319 ir->array->accept(this);
2320
2321 this->deref = nir_build_deref_array(&b, this->deref, index);
2322 }
2323
2324 void
2325 nir_visitor::visit(ir_barrier *)
2326 {
2327 nir_intrinsic_instr *instr =
2328 nir_intrinsic_instr_create(this->shader, nir_intrinsic_barrier);
2329 nir_builder_instr_insert(&b, &instr->instr);
2330 }