glsl: Remove integer matrix support from ir_dereference_array::constant_expression_value
[mesa.git] / src / compiler / glsl / builtin_functions.cpp
1 /*
2 * Copyright © 2013 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
21 * DEALINGS IN THE SOFTWARE.
22 */
23
24 /**
25 * \file builtin_functions.cpp
26 *
27 * Support for GLSL built-in functions.
28 *
29 * This file is split into several main components:
30 *
31 * 1. Availability predicates
32 *
33 * A series of small functions that check whether the current shader
34 * supports the version/extensions required to expose a built-in.
35 *
36 * 2. Core builtin_builder class functionality
37 *
38 * 3. Lists of built-in functions
39 *
40 * The builtin_builder::create_builtins() function contains lists of all
41 * built-in function signatures, where they're available, what types they
42 * take, and so on.
43 *
44 * 4. Implementations of built-in function signatures
45 *
46 * A series of functions which create ir_function_signatures and emit IR
47 * via ir_builder to implement them.
48 *
49 * 5. External API
50 *
51 * A few functions the rest of the compiler can use to interact with the
52 * built-in function module. For example, searching for a built-in by
53 * name and parameters.
54 */
55
56
57 /**
58 * Unfortunately, some versions of MinGW produce bad code if this file
59 * is compiled with -O2 or -O3. The resulting driver will crash in random
60 * places if the app uses GLSL.
61 * The work-around is to disable optimizations for just this file. Luckily,
62 * this code is basically just executed once.
63 *
64 * MinGW 4.6.3 (in Ubuntu 13.10) does not have this bug.
65 * MinGW 5.3.1 (in Ubuntu 16.04) definitely has this bug.
66 * MinGW 6.2.0 (in Ubuntu 16.10) definitely has this bug.
67 * MinGW x.y.z - don't know. Assume versions after 4.6.x are buggy
68 */
69
70 #if defined(__MINGW32__) && ((__GNUC__ * 100) + __GNUC_MINOR >= 407)
71 #warning "disabling optimizations for this file to work around compiler bug"
72 #pragma GCC optimize("O1")
73 #endif
74
75
76 #include <stdarg.h>
77 #include <stdio.h>
78 #include "main/mtypes.h"
79 #include "main/shaderobj.h"
80 #include "ir_builder.h"
81 #include "glsl_parser_extras.h"
82 #include "program/prog_instruction.h"
83 #include <math.h>
84 #include "builtin_functions.h"
85 #include "util/hash_table.h"
86
87 #define M_PIf ((float) M_PI)
88 #define M_PI_2f ((float) M_PI_2)
89 #define M_PI_4f ((float) M_PI_4)
90
91 using namespace ir_builder;
92
93 /**
94 * Availability predicates:
95 * @{
96 */
97 static bool
98 always_available(const _mesa_glsl_parse_state *)
99 {
100 return true;
101 }
102
103 static bool
104 compatibility_vs_only(const _mesa_glsl_parse_state *state)
105 {
106 return state->stage == MESA_SHADER_VERTEX &&
107 (state->compat_shader || state->ARB_compatibility_enable) &&
108 !state->es_shader;
109 }
110
111 static bool
112 derivatives_only(const _mesa_glsl_parse_state *state)
113 {
114 return state->stage == MESA_SHADER_FRAGMENT ||
115 (state->stage == MESA_SHADER_COMPUTE &&
116 state->NV_compute_shader_derivatives_enable);
117 }
118
119 static bool
120 gs_only(const _mesa_glsl_parse_state *state)
121 {
122 return state->stage == MESA_SHADER_GEOMETRY;
123 }
124
125 static bool
126 v110(const _mesa_glsl_parse_state *state)
127 {
128 return !state->es_shader;
129 }
130
131 static bool
132 v110_derivatives_only(const _mesa_glsl_parse_state *state)
133 {
134 return !state->es_shader &&
135 derivatives_only(state);
136 }
137
138 static bool
139 v120(const _mesa_glsl_parse_state *state)
140 {
141 return state->is_version(120, 300);
142 }
143
144 static bool
145 v130(const _mesa_glsl_parse_state *state)
146 {
147 return state->is_version(130, 300);
148 }
149
150 static bool
151 v130_desktop(const _mesa_glsl_parse_state *state)
152 {
153 return state->is_version(130, 0);
154 }
155
156 static bool
157 v460_desktop(const _mesa_glsl_parse_state *state)
158 {
159 return state->is_version(460, 0);
160 }
161
162 static bool
163 v130_derivatives_only(const _mesa_glsl_parse_state *state)
164 {
165 return state->is_version(130, 300) &&
166 derivatives_only(state);
167 }
168
169 static bool
170 v140_or_es3(const _mesa_glsl_parse_state *state)
171 {
172 return state->is_version(140, 300);
173 }
174
175 static bool
176 v400_derivatives_only(const _mesa_glsl_parse_state *state)
177 {
178 return state->is_version(400, 0) &&
179 derivatives_only(state);
180 }
181
182 static bool
183 texture_rectangle(const _mesa_glsl_parse_state *state)
184 {
185 return state->ARB_texture_rectangle_enable;
186 }
187
188 static bool
189 texture_external(const _mesa_glsl_parse_state *state)
190 {
191 return state->OES_EGL_image_external_enable;
192 }
193
194 static bool
195 texture_external_es3(const _mesa_glsl_parse_state *state)
196 {
197 return state->OES_EGL_image_external_essl3_enable &&
198 state->es_shader &&
199 state->is_version(0, 300);
200 }
201
202 /** True if texturing functions with explicit LOD are allowed. */
203 static bool
204 lod_exists_in_stage(const _mesa_glsl_parse_state *state)
205 {
206 /* Texturing functions with "Lod" in their name exist:
207 * - In the vertex shader stage (for all languages)
208 * - In any stage for GLSL 1.30+ or GLSL ES 3.00
209 * - In any stage for desktop GLSL with ARB_shader_texture_lod enabled.
210 *
211 * Since ARB_shader_texture_lod can only be enabled on desktop GLSL, we
212 * don't need to explicitly check state->es_shader.
213 */
214 return state->stage == MESA_SHADER_VERTEX ||
215 state->is_version(130, 300) ||
216 state->ARB_shader_texture_lod_enable ||
217 state->EXT_gpu_shader4_enable;
218 }
219
220 static bool
221 v110_lod(const _mesa_glsl_parse_state *state)
222 {
223 return !state->es_shader && lod_exists_in_stage(state);
224 }
225
226 static bool
227 texture_buffer(const _mesa_glsl_parse_state *state)
228 {
229 return state->is_version(140, 320) ||
230 state->EXT_texture_buffer_enable ||
231 state->OES_texture_buffer_enable;
232 }
233
234 static bool
235 shader_texture_lod(const _mesa_glsl_parse_state *state)
236 {
237 return state->ARB_shader_texture_lod_enable;
238 }
239
240 static bool
241 shader_texture_lod_and_rect(const _mesa_glsl_parse_state *state)
242 {
243 return state->ARB_shader_texture_lod_enable &&
244 state->ARB_texture_rectangle_enable;
245 }
246
247 static bool
248 shader_bit_encoding(const _mesa_glsl_parse_state *state)
249 {
250 return state->is_version(330, 300) ||
251 state->ARB_shader_bit_encoding_enable ||
252 state->ARB_gpu_shader5_enable;
253 }
254
255 static bool
256 shader_integer_mix(const _mesa_glsl_parse_state *state)
257 {
258 return state->is_version(450, 310) ||
259 state->ARB_ES3_1_compatibility_enable ||
260 (v130(state) && state->EXT_shader_integer_mix_enable);
261 }
262
263 static bool
264 shader_packing_or_es3(const _mesa_glsl_parse_state *state)
265 {
266 return state->ARB_shading_language_packing_enable ||
267 state->is_version(420, 300);
268 }
269
270 static bool
271 shader_packing_or_es3_or_gpu_shader5(const _mesa_glsl_parse_state *state)
272 {
273 return state->ARB_shading_language_packing_enable ||
274 state->ARB_gpu_shader5_enable ||
275 state->is_version(400, 300);
276 }
277
278 static bool
279 gpu_shader4(const _mesa_glsl_parse_state *state)
280 {
281 return state->EXT_gpu_shader4_enable;
282 }
283
284 static bool
285 gpu_shader4_integer(const _mesa_glsl_parse_state *state)
286 {
287 return state->EXT_gpu_shader4_enable &&
288 state->ctx->Extensions.EXT_texture_integer;
289 }
290
291 static bool
292 gpu_shader4_array(const _mesa_glsl_parse_state *state)
293 {
294 return state->EXT_gpu_shader4_enable &&
295 state->ctx->Extensions.EXT_texture_array;
296 }
297
298 static bool
299 gpu_shader4_array_integer(const _mesa_glsl_parse_state *state)
300 {
301 return gpu_shader4_array(state) &&
302 state->ctx->Extensions.EXT_texture_integer;
303 }
304
305 static bool
306 gpu_shader4_rect(const _mesa_glsl_parse_state *state)
307 {
308 return state->EXT_gpu_shader4_enable &&
309 state->ctx->Extensions.NV_texture_rectangle;
310 }
311
312 static bool
313 gpu_shader4_rect_integer(const _mesa_glsl_parse_state *state)
314 {
315 return gpu_shader4_rect(state) &&
316 state->ctx->Extensions.EXT_texture_integer;
317 }
318
319 static bool
320 gpu_shader4_tbo(const _mesa_glsl_parse_state *state)
321 {
322 return state->EXT_gpu_shader4_enable &&
323 state->ctx->Extensions.EXT_texture_buffer_object;
324 }
325
326 static bool
327 gpu_shader4_tbo_integer(const _mesa_glsl_parse_state *state)
328 {
329 return gpu_shader4_tbo(state) &&
330 state->ctx->Extensions.EXT_texture_integer;
331 }
332
333 static bool
334 gpu_shader4_derivs_only(const _mesa_glsl_parse_state *state)
335 {
336 return state->EXT_gpu_shader4_enable &&
337 derivatives_only(state);
338 }
339
340 static bool
341 gpu_shader4_integer_derivs_only(const _mesa_glsl_parse_state *state)
342 {
343 return gpu_shader4_derivs_only(state) &&
344 state->ctx->Extensions.EXT_texture_integer;
345 }
346
347 static bool
348 gpu_shader4_array_derivs_only(const _mesa_glsl_parse_state *state)
349 {
350 return gpu_shader4_derivs_only(state) &&
351 state->ctx->Extensions.EXT_texture_array;
352 }
353
354 static bool
355 gpu_shader4_array_integer_derivs_only(const _mesa_glsl_parse_state *state)
356 {
357 return gpu_shader4_array_derivs_only(state) &&
358 state->ctx->Extensions.EXT_texture_integer;
359 }
360
361 static bool
362 v130_or_gpu_shader4(const _mesa_glsl_parse_state *state)
363 {
364 return state->is_version(130, 300) || state->EXT_gpu_shader4_enable;
365 }
366
367 static bool
368 v130_or_gpu_shader4_and_tex_shadow_lod(const _mesa_glsl_parse_state *state)
369 {
370 return v130_or_gpu_shader4(state) &&
371 state->EXT_texture_shadow_lod_enable;
372 }
373
374 static bool
375 gpu_shader5(const _mesa_glsl_parse_state *state)
376 {
377 return state->is_version(400, 0) || state->ARB_gpu_shader5_enable;
378 }
379
380 static bool
381 gpu_shader5_es(const _mesa_glsl_parse_state *state)
382 {
383 return state->is_version(400, 320) ||
384 state->ARB_gpu_shader5_enable ||
385 state->EXT_gpu_shader5_enable ||
386 state->OES_gpu_shader5_enable;
387 }
388
389 static bool
390 gpu_shader5_or_OES_texture_cube_map_array(const _mesa_glsl_parse_state *state)
391 {
392 return state->is_version(400, 320) ||
393 state->ARB_gpu_shader5_enable ||
394 state->EXT_texture_cube_map_array_enable ||
395 state->OES_texture_cube_map_array_enable;
396 }
397
398 static bool
399 es31_not_gs5(const _mesa_glsl_parse_state *state)
400 {
401 return state->is_version(0, 310) && !gpu_shader5_es(state);
402 }
403
404 static bool
405 gpu_shader5_or_es31(const _mesa_glsl_parse_state *state)
406 {
407 return state->is_version(400, 310) || state->ARB_gpu_shader5_enable;
408 }
409
410 static bool
411 shader_packing_or_es31_or_gpu_shader5(const _mesa_glsl_parse_state *state)
412 {
413 return state->ARB_shading_language_packing_enable ||
414 state->ARB_gpu_shader5_enable ||
415 state->is_version(400, 310);
416 }
417
418 static bool
419 gpu_shader5_or_es31_or_integer_functions(const _mesa_glsl_parse_state *state)
420 {
421 return gpu_shader5_or_es31(state) ||
422 state->MESA_shader_integer_functions_enable;
423 }
424
425 static bool
426 fs_interpolate_at(const _mesa_glsl_parse_state *state)
427 {
428 return state->stage == MESA_SHADER_FRAGMENT &&
429 (state->is_version(400, 320) ||
430 state->ARB_gpu_shader5_enable ||
431 state->OES_shader_multisample_interpolation_enable);
432 }
433
434
435 static bool
436 texture_array_lod(const _mesa_glsl_parse_state *state)
437 {
438 return lod_exists_in_stage(state) &&
439 (state->EXT_texture_array_enable ||
440 (state->EXT_gpu_shader4_enable &&
441 state->ctx->Extensions.EXT_texture_array));
442 }
443
444 static bool
445 texture_array(const _mesa_glsl_parse_state *state)
446 {
447 return state->EXT_texture_array_enable ||
448 (state->EXT_gpu_shader4_enable &&
449 state->ctx->Extensions.EXT_texture_array);
450 }
451
452 static bool
453 texture_array_derivs_only(const _mesa_glsl_parse_state *state)
454 {
455 return derivatives_only(state) &&
456 texture_array(state);
457 }
458
459 static bool
460 texture_multisample(const _mesa_glsl_parse_state *state)
461 {
462 return state->is_version(150, 310) ||
463 state->ARB_texture_multisample_enable;
464 }
465
466 static bool
467 texture_multisample_array(const _mesa_glsl_parse_state *state)
468 {
469 return state->is_version(150, 320) ||
470 state->ARB_texture_multisample_enable ||
471 state->OES_texture_storage_multisample_2d_array_enable;
472 }
473
474 static bool
475 texture_samples_identical(const _mesa_glsl_parse_state *state)
476 {
477 return texture_multisample(state) &&
478 state->EXT_shader_samples_identical_enable;
479 }
480
481 static bool
482 texture_samples_identical_array(const _mesa_glsl_parse_state *state)
483 {
484 return texture_multisample_array(state) &&
485 state->EXT_shader_samples_identical_enable;
486 }
487
488 static bool
489 derivatives_texture_cube_map_array(const _mesa_glsl_parse_state *state)
490 {
491 return state->has_texture_cube_map_array() &&
492 derivatives_only(state);
493 }
494
495 static bool
496 texture_cube_map_array(const _mesa_glsl_parse_state *state)
497 {
498 return state->has_texture_cube_map_array();
499 }
500
501 static bool
502 v130_or_gpu_shader4_and_tex_cube_map_array(const _mesa_glsl_parse_state *state)
503 {
504 return texture_cube_map_array(state) &&
505 v130_or_gpu_shader4(state) &&
506 state->EXT_texture_shadow_lod_enable;
507 }
508
509 static bool
510 texture_query_levels(const _mesa_glsl_parse_state *state)
511 {
512 return state->is_version(430, 0) ||
513 state->ARB_texture_query_levels_enable;
514 }
515
516 static bool
517 texture_query_lod(const _mesa_glsl_parse_state *state)
518 {
519 return derivatives_only(state) &&
520 (state->ARB_texture_query_lod_enable ||
521 state->EXT_texture_query_lod_enable);
522 }
523
524 static bool
525 texture_gather_cube_map_array(const _mesa_glsl_parse_state *state)
526 {
527 return state->is_version(400, 320) ||
528 state->ARB_texture_gather_enable ||
529 state->ARB_gpu_shader5_enable ||
530 state->EXT_texture_cube_map_array_enable ||
531 state->OES_texture_cube_map_array_enable;
532 }
533
534 static bool
535 texture_texture4(const _mesa_glsl_parse_state *state)
536 {
537 return state->AMD_texture_texture4_enable;
538 }
539
540 static bool
541 texture_gather_or_es31(const _mesa_glsl_parse_state *state)
542 {
543 return state->is_version(400, 310) ||
544 state->ARB_texture_gather_enable ||
545 state->ARB_gpu_shader5_enable;
546 }
547
548 /* Only ARB_texture_gather but not GLSL 4.0 or ARB_gpu_shader5.
549 * used for relaxation of const offset requirements.
550 */
551 static bool
552 texture_gather_only_or_es31(const _mesa_glsl_parse_state *state)
553 {
554 return !state->is_version(400, 320) &&
555 !state->ARB_gpu_shader5_enable &&
556 !state->EXT_gpu_shader5_enable &&
557 !state->OES_gpu_shader5_enable &&
558 (state->ARB_texture_gather_enable ||
559 state->is_version(0, 310));
560 }
561
562 /* Desktop GL or OES_standard_derivatives */
563 static bool
564 derivatives(const _mesa_glsl_parse_state *state)
565 {
566 return derivatives_only(state) &&
567 (state->is_version(110, 300) ||
568 state->OES_standard_derivatives_enable ||
569 state->ctx->Const.AllowGLSLRelaxedES);
570 }
571
572 static bool
573 derivative_control(const _mesa_glsl_parse_state *state)
574 {
575 return derivatives_only(state) &&
576 (state->is_version(450, 0) ||
577 state->ARB_derivative_control_enable);
578 }
579
580 static bool
581 tex1d_lod(const _mesa_glsl_parse_state *state)
582 {
583 return !state->es_shader && lod_exists_in_stage(state);
584 }
585
586 /** True if sampler3D exists */
587 static bool
588 tex3d(const _mesa_glsl_parse_state *state)
589 {
590 /* sampler3D exists in all desktop GLSL versions, GLSL ES 1.00 with the
591 * OES_texture_3D extension, and in GLSL ES 3.00.
592 */
593 return !state->es_shader ||
594 state->OES_texture_3D_enable ||
595 state->language_version >= 300;
596 }
597
598 static bool
599 derivatives_tex3d(const _mesa_glsl_parse_state *state)
600 {
601 return (!state->es_shader || state->OES_texture_3D_enable) &&
602 derivatives_only(state);
603 }
604
605 static bool
606 tex3d_lod(const _mesa_glsl_parse_state *state)
607 {
608 return tex3d(state) && lod_exists_in_stage(state);
609 }
610
611 static bool
612 shader_atomic_counters(const _mesa_glsl_parse_state *state)
613 {
614 return state->has_atomic_counters();
615 }
616
617 static bool
618 shader_atomic_counter_ops(const _mesa_glsl_parse_state *state)
619 {
620 return state->ARB_shader_atomic_counter_ops_enable;
621 }
622
623 static bool
624 shader_atomic_counter_ops_or_v460_desktop(const _mesa_glsl_parse_state *state)
625 {
626 return state->ARB_shader_atomic_counter_ops_enable || v460_desktop(state);
627 }
628
629 static bool
630 shader_ballot(const _mesa_glsl_parse_state *state)
631 {
632 return state->ARB_shader_ballot_enable;
633 }
634
635 static bool
636 supports_arb_fragment_shader_interlock(const _mesa_glsl_parse_state *state)
637 {
638 return state->ARB_fragment_shader_interlock_enable;
639 }
640
641 static bool
642 supports_nv_fragment_shader_interlock(const _mesa_glsl_parse_state *state)
643 {
644 return state->NV_fragment_shader_interlock_enable;
645 }
646
647 static bool
648 shader_clock(const _mesa_glsl_parse_state *state)
649 {
650 return state->ARB_shader_clock_enable;
651 }
652
653 static bool
654 shader_clock_int64(const _mesa_glsl_parse_state *state)
655 {
656 return state->ARB_shader_clock_enable &&
657 (state->ARB_gpu_shader_int64_enable ||
658 state->AMD_gpu_shader_int64_enable);
659 }
660
661 static bool
662 shader_storage_buffer_object(const _mesa_glsl_parse_state *state)
663 {
664 return state->has_shader_storage_buffer_objects();
665 }
666
667 static bool
668 shader_trinary_minmax(const _mesa_glsl_parse_state *state)
669 {
670 return state->AMD_shader_trinary_minmax_enable;
671 }
672
673 static bool
674 shader_image_load_store(const _mesa_glsl_parse_state *state)
675 {
676 return (state->is_version(420, 310) ||
677 state->ARB_shader_image_load_store_enable ||
678 state->EXT_shader_image_load_store_enable);
679 }
680
681 static bool
682 shader_image_load_store_ext(const _mesa_glsl_parse_state *state)
683 {
684 return state->EXT_shader_image_load_store_enable;
685 }
686
687 static bool
688 shader_image_atomic(const _mesa_glsl_parse_state *state)
689 {
690 return (state->is_version(420, 320) ||
691 state->ARB_shader_image_load_store_enable ||
692 state->EXT_shader_image_load_store_enable ||
693 state->OES_shader_image_atomic_enable);
694 }
695
696 static bool
697 shader_image_atomic_exchange_float(const _mesa_glsl_parse_state *state)
698 {
699 return (state->is_version(450, 320) ||
700 state->ARB_ES3_1_compatibility_enable ||
701 state->OES_shader_image_atomic_enable ||
702 state->NV_shader_atomic_float_enable);
703 }
704
705 static bool
706 shader_image_atomic_add_float(const _mesa_glsl_parse_state *state)
707 {
708 return state->NV_shader_atomic_float_enable;
709 }
710
711 static bool
712 shader_image_size(const _mesa_glsl_parse_state *state)
713 {
714 return state->is_version(430, 310) ||
715 state->ARB_shader_image_size_enable;
716 }
717
718 static bool
719 shader_samples(const _mesa_glsl_parse_state *state)
720 {
721 return state->is_version(450, 0) ||
722 state->ARB_shader_texture_image_samples_enable;
723 }
724
725 static bool
726 gs_streams(const _mesa_glsl_parse_state *state)
727 {
728 return gpu_shader5(state) && gs_only(state);
729 }
730
731 static bool
732 fp64(const _mesa_glsl_parse_state *state)
733 {
734 return state->has_double();
735 }
736
737 static bool
738 int64(const _mesa_glsl_parse_state *state)
739 {
740 return state->has_int64();
741 }
742
743 static bool
744 int64_fp64(const _mesa_glsl_parse_state *state)
745 {
746 return state->has_int64() && state->has_double();
747 }
748
749 static bool
750 compute_shader(const _mesa_glsl_parse_state *state)
751 {
752 return state->stage == MESA_SHADER_COMPUTE;
753 }
754
755 static bool
756 compute_shader_supported(const _mesa_glsl_parse_state *state)
757 {
758 return state->has_compute_shader();
759 }
760
761 static bool
762 buffer_atomics_supported(const _mesa_glsl_parse_state *state)
763 {
764 return compute_shader(state) || shader_storage_buffer_object(state);
765 }
766
767 static bool
768 barrier_supported(const _mesa_glsl_parse_state *state)
769 {
770 return compute_shader(state) ||
771 state->stage == MESA_SHADER_TESS_CTRL;
772 }
773
774 static bool
775 vote(const _mesa_glsl_parse_state *state)
776 {
777 return state->ARB_shader_group_vote_enable;
778 }
779
780 static bool
781 vote_or_v460_desktop(const _mesa_glsl_parse_state *state)
782 {
783 return state->ARB_shader_group_vote_enable || v460_desktop(state);
784 }
785
786 static bool
787 integer_functions_supported(const _mesa_glsl_parse_state *state)
788 {
789 return state->extensions->MESA_shader_integer_functions;
790 }
791
792 static bool
793 NV_shader_atomic_float_supported(const _mesa_glsl_parse_state *state)
794 {
795 return state->extensions->NV_shader_atomic_float;
796 }
797
798 static bool
799 shader_atomic_float_add(const _mesa_glsl_parse_state *state)
800 {
801 return state->NV_shader_atomic_float_enable;
802 }
803
804 static bool
805 shader_atomic_float_exchange(const _mesa_glsl_parse_state *state)
806 {
807 return state->NV_shader_atomic_float_enable ||
808 state->INTEL_shader_atomic_float_minmax_enable;
809 }
810
811 static bool
812 INTEL_shader_atomic_float_minmax_supported(const _mesa_glsl_parse_state *state)
813 {
814 return state->extensions->INTEL_shader_atomic_float_minmax;
815 }
816
817 static bool
818 shader_atomic_float_minmax(const _mesa_glsl_parse_state *state)
819 {
820 return state->INTEL_shader_atomic_float_minmax_enable;
821 }
822
823 static bool
824 demote_to_helper_invocation(const _mesa_glsl_parse_state *state)
825 {
826 return state->EXT_demote_to_helper_invocation_enable;
827 }
828
829 static bool
830 shader_integer_functions2(const _mesa_glsl_parse_state *state)
831 {
832 return state->INTEL_shader_integer_functions2_enable;
833 }
834
835 static bool
836 shader_integer_functions2_int64(const _mesa_glsl_parse_state *state)
837 {
838 return state->INTEL_shader_integer_functions2_enable && state->has_int64();
839 }
840
841 static bool
842 is_nir(const _mesa_glsl_parse_state *state)
843 {
844 return state->ctx->Const.ShaderCompilerOptions[state->stage].NirOptions;
845 }
846
847 static bool
848 is_not_nir(const _mesa_glsl_parse_state *state)
849 {
850 return !is_nir(state);
851 }
852
853 /** @} */
854
855 /******************************************************************************/
856
857 namespace {
858
859 /**
860 * builtin_builder: A singleton object representing the core of the built-in
861 * function module.
862 *
863 * It generates IR for every built-in function signature, and organizes them
864 * into functions.
865 */
866 class builtin_builder {
867 public:
868 builtin_builder();
869 ~builtin_builder();
870
871 void initialize();
872 void release();
873 ir_function_signature *find(_mesa_glsl_parse_state *state,
874 const char *name, exec_list *actual_parameters);
875
876 /**
877 * A shader to hold all the built-in signatures; created by this module.
878 *
879 * This includes signatures for every built-in, regardless of version or
880 * enabled extensions. The availability predicate associated with each
881 * signature allows matching_signature() to filter out the irrelevant ones.
882 */
883 gl_shader *shader;
884
885 private:
886 void *mem_ctx;
887
888 void create_shader();
889 void create_intrinsics();
890 void create_builtins();
891
892 /**
893 * IR builder helpers:
894 *
895 * These convenience functions assist in emitting IR, but don't necessarily
896 * fit in ir_builder itself. Many of them rely on having a mem_ctx class
897 * member available.
898 */
899 ir_variable *in_var(const glsl_type *type, const char *name);
900 ir_variable *out_var(const glsl_type *type, const char *name);
901 ir_constant *imm(float f, unsigned vector_elements=1);
902 ir_constant *imm(bool b, unsigned vector_elements=1);
903 ir_constant *imm(int i, unsigned vector_elements=1);
904 ir_constant *imm(unsigned u, unsigned vector_elements=1);
905 ir_constant *imm(double d, unsigned vector_elements=1);
906 ir_constant *imm(const glsl_type *type, const ir_constant_data &);
907 ir_dereference_variable *var_ref(ir_variable *var);
908 ir_dereference_array *array_ref(ir_variable *var, int i);
909 ir_swizzle *matrix_elt(ir_variable *var, int col, int row);
910
911 ir_expression *asin_expr(ir_variable *x, float p0, float p1);
912 void do_atan(ir_factory &body, const glsl_type *type, ir_variable *res, operand y_over_x);
913
914 /**
915 * Call function \param f with parameters specified as the linked
916 * list \param params of \c ir_variable objects. \param ret should
917 * point to the ir_variable that will hold the function return
918 * value, or be \c NULL if the function has void return type.
919 */
920 ir_call *call(ir_function *f, ir_variable *ret, exec_list params);
921
922 /** Create a new function and add the given signatures. */
923 void add_function(const char *name, ...);
924
925 typedef ir_function_signature *(builtin_builder::*image_prototype_ctr)(const glsl_type *image_type,
926 unsigned num_arguments,
927 unsigned flags);
928
929 /**
930 * Create a new image built-in function for all known image types.
931 * \p flags is a bitfield of \c image_function_flags flags.
932 */
933 void add_image_function(const char *name,
934 const char *intrinsic_name,
935 image_prototype_ctr prototype,
936 unsigned num_arguments,
937 unsigned flags,
938 enum ir_intrinsic_id id);
939
940 /**
941 * Create new functions for all known image built-ins and types.
942 * If \p glsl is \c true, use the GLSL built-in names and emit code
943 * to call into the actual compiler intrinsic. If \p glsl is
944 * false, emit a function prototype with no body for each image
945 * intrinsic name.
946 */
947 void add_image_functions(bool glsl);
948
949 ir_function_signature *new_sig(const glsl_type *return_type,
950 builtin_available_predicate avail,
951 int num_params, ...);
952
953 /**
954 * Function signature generators:
955 * @{
956 */
957 ir_function_signature *unop(builtin_available_predicate avail,
958 ir_expression_operation opcode,
959 const glsl_type *return_type,
960 const glsl_type *param_type);
961 ir_function_signature *binop(builtin_available_predicate avail,
962 ir_expression_operation opcode,
963 const glsl_type *return_type,
964 const glsl_type *param0_type,
965 const glsl_type *param1_type,
966 bool swap_operands = false);
967
968 #define B0(X) ir_function_signature *_##X();
969 #define B1(X) ir_function_signature *_##X(const glsl_type *);
970 #define B2(X) ir_function_signature *_##X(const glsl_type *, const glsl_type *);
971 #define B3(X) ir_function_signature *_##X(const glsl_type *, const glsl_type *, const glsl_type *);
972 #define BA1(X) ir_function_signature *_##X(builtin_available_predicate, const glsl_type *);
973 #define BA2(X) ir_function_signature *_##X(builtin_available_predicate, const glsl_type *, const glsl_type *);
974 B1(radians)
975 B1(degrees)
976 B1(sin)
977 B1(cos)
978 B1(tan)
979 B1(asin)
980 B1(acos)
981 B1(atan2)
982 B1(atan)
983 B1(atan2_op)
984 B1(atan_op)
985 B1(sinh)
986 B1(cosh)
987 B1(tanh)
988 B1(asinh)
989 B1(acosh)
990 B1(atanh)
991 B1(pow)
992 B1(exp)
993 B1(log)
994 B1(exp2)
995 B1(log2)
996 BA1(sqrt)
997 BA1(inversesqrt)
998 BA1(abs)
999 BA1(sign)
1000 BA1(floor)
1001 BA1(truncate)
1002 BA1(trunc)
1003 BA1(round)
1004 BA1(roundEven)
1005 BA1(ceil)
1006 BA1(fract)
1007 BA2(mod)
1008 BA1(modf)
1009 BA2(min)
1010 BA2(max)
1011 BA2(clamp)
1012 BA2(mix_lrp)
1013 ir_function_signature *_mix_sel(builtin_available_predicate avail,
1014 const glsl_type *val_type,
1015 const glsl_type *blend_type);
1016 BA2(step)
1017 BA2(smoothstep)
1018 BA1(isnan)
1019 BA1(isinf)
1020 B1(floatBitsToInt)
1021 B1(floatBitsToUint)
1022 B1(intBitsToFloat)
1023 B1(uintBitsToFloat)
1024
1025 BA1(doubleBitsToInt64)
1026 BA1(doubleBitsToUint64)
1027 BA1(int64BitsToDouble)
1028 BA1(uint64BitsToDouble)
1029
1030 ir_function_signature *_packUnorm2x16(builtin_available_predicate avail);
1031 ir_function_signature *_packSnorm2x16(builtin_available_predicate avail);
1032 ir_function_signature *_packUnorm4x8(builtin_available_predicate avail);
1033 ir_function_signature *_packSnorm4x8(builtin_available_predicate avail);
1034 ir_function_signature *_unpackUnorm2x16(builtin_available_predicate avail);
1035 ir_function_signature *_unpackSnorm2x16(builtin_available_predicate avail);
1036 ir_function_signature *_unpackUnorm4x8(builtin_available_predicate avail);
1037 ir_function_signature *_unpackSnorm4x8(builtin_available_predicate avail);
1038 ir_function_signature *_packHalf2x16(builtin_available_predicate avail);
1039 ir_function_signature *_unpackHalf2x16(builtin_available_predicate avail);
1040 ir_function_signature *_packDouble2x32(builtin_available_predicate avail);
1041 ir_function_signature *_unpackDouble2x32(builtin_available_predicate avail);
1042 ir_function_signature *_packInt2x32(builtin_available_predicate avail);
1043 ir_function_signature *_unpackInt2x32(builtin_available_predicate avail);
1044 ir_function_signature *_packUint2x32(builtin_available_predicate avail);
1045 ir_function_signature *_unpackUint2x32(builtin_available_predicate avail);
1046
1047 BA1(length)
1048 BA1(distance);
1049 BA1(dot);
1050 BA1(cross);
1051 BA1(normalize);
1052 B0(ftransform);
1053 BA1(faceforward);
1054 BA1(reflect);
1055 BA1(refract);
1056 BA1(matrixCompMult);
1057 BA1(outerProduct);
1058 BA1(determinant_mat2);
1059 BA1(determinant_mat3);
1060 BA1(determinant_mat4);
1061 BA1(inverse_mat2);
1062 BA1(inverse_mat3);
1063 BA1(inverse_mat4);
1064 BA1(transpose);
1065 BA1(lessThan);
1066 BA1(lessThanEqual);
1067 BA1(greaterThan);
1068 BA1(greaterThanEqual);
1069 BA1(equal);
1070 BA1(notEqual);
1071 B1(any);
1072 B1(all);
1073 B1(not);
1074 BA2(textureSize);
1075 BA1(textureSamples);
1076
1077 /** Flags to _texture() */
1078 #define TEX_PROJECT 1
1079 #define TEX_OFFSET 2
1080 #define TEX_COMPONENT 4
1081 #define TEX_OFFSET_NONCONST 8
1082 #define TEX_OFFSET_ARRAY 16
1083
1084 ir_function_signature *_texture(ir_texture_opcode opcode,
1085 builtin_available_predicate avail,
1086 const glsl_type *return_type,
1087 const glsl_type *sampler_type,
1088 const glsl_type *coord_type,
1089 int flags = 0);
1090 ir_function_signature *_textureCubeArrayShadow(ir_texture_opcode opcode,
1091 builtin_available_predicate avail,
1092 const glsl_type *x);
1093 ir_function_signature *_texelFetch(builtin_available_predicate avail,
1094 const glsl_type *return_type,
1095 const glsl_type *sampler_type,
1096 const glsl_type *coord_type,
1097 const glsl_type *offset_type = NULL);
1098
1099 B0(EmitVertex)
1100 B0(EndPrimitive)
1101 ir_function_signature *_EmitStreamVertex(builtin_available_predicate avail,
1102 const glsl_type *stream_type);
1103 ir_function_signature *_EndStreamPrimitive(builtin_available_predicate avail,
1104 const glsl_type *stream_type);
1105 B0(barrier)
1106
1107 BA2(textureQueryLod);
1108 BA1(textureQueryLevels);
1109 BA2(textureSamplesIdentical);
1110 B1(dFdx);
1111 B1(dFdy);
1112 B1(fwidth);
1113 B1(dFdxCoarse);
1114 B1(dFdyCoarse);
1115 B1(fwidthCoarse);
1116 B1(dFdxFine);
1117 B1(dFdyFine);
1118 B1(fwidthFine);
1119 B1(noise1);
1120 B1(noise2);
1121 B1(noise3);
1122 B1(noise4);
1123
1124 B1(bitfieldExtract)
1125 B1(bitfieldInsert)
1126 B1(bitfieldReverse)
1127 B1(bitCount)
1128 B1(findLSB)
1129 B1(findMSB)
1130 BA1(countLeadingZeros)
1131 BA1(countTrailingZeros)
1132 BA1(fma)
1133 B2(ldexp)
1134 B2(frexp)
1135 B2(dfrexp)
1136 B1(uaddCarry)
1137 B1(usubBorrow)
1138 BA1(addSaturate)
1139 BA1(subtractSaturate)
1140 BA1(absoluteDifference)
1141 BA1(average)
1142 BA1(averageRounded)
1143 B1(mulExtended)
1144 BA1(multiply32x16)
1145 B1(interpolateAtCentroid)
1146 B1(interpolateAtOffset)
1147 B1(interpolateAtSample)
1148
1149 ir_function_signature *_atomic_counter_intrinsic(builtin_available_predicate avail,
1150 enum ir_intrinsic_id id);
1151 ir_function_signature *_atomic_counter_intrinsic1(builtin_available_predicate avail,
1152 enum ir_intrinsic_id id);
1153 ir_function_signature *_atomic_counter_intrinsic2(builtin_available_predicate avail,
1154 enum ir_intrinsic_id id);
1155 ir_function_signature *_atomic_counter_op(const char *intrinsic,
1156 builtin_available_predicate avail);
1157 ir_function_signature *_atomic_counter_op1(const char *intrinsic,
1158 builtin_available_predicate avail);
1159 ir_function_signature *_atomic_counter_op2(const char *intrinsic,
1160 builtin_available_predicate avail);
1161
1162 ir_function_signature *_atomic_intrinsic2(builtin_available_predicate avail,
1163 const glsl_type *type,
1164 enum ir_intrinsic_id id);
1165 ir_function_signature *_atomic_op2(const char *intrinsic,
1166 builtin_available_predicate avail,
1167 const glsl_type *type);
1168 ir_function_signature *_atomic_intrinsic3(builtin_available_predicate avail,
1169 const glsl_type *type,
1170 enum ir_intrinsic_id id);
1171 ir_function_signature *_atomic_op3(const char *intrinsic,
1172 builtin_available_predicate avail,
1173 const glsl_type *type);
1174
1175 B1(min3)
1176 B1(max3)
1177 B1(mid3)
1178
1179 ir_function_signature *_image_prototype(const glsl_type *image_type,
1180 unsigned num_arguments,
1181 unsigned flags);
1182 ir_function_signature *_image_size_prototype(const glsl_type *image_type,
1183 unsigned num_arguments,
1184 unsigned flags);
1185 ir_function_signature *_image_samples_prototype(const glsl_type *image_type,
1186 unsigned num_arguments,
1187 unsigned flags);
1188 ir_function_signature *_image(image_prototype_ctr prototype,
1189 const glsl_type *image_type,
1190 const char *intrinsic_name,
1191 unsigned num_arguments,
1192 unsigned flags,
1193 enum ir_intrinsic_id id);
1194
1195 ir_function_signature *_memory_barrier_intrinsic(
1196 builtin_available_predicate avail,
1197 enum ir_intrinsic_id id);
1198 ir_function_signature *_memory_barrier(const char *intrinsic_name,
1199 builtin_available_predicate avail);
1200
1201 ir_function_signature *_ballot_intrinsic();
1202 ir_function_signature *_ballot();
1203 ir_function_signature *_read_first_invocation_intrinsic(const glsl_type *type);
1204 ir_function_signature *_read_first_invocation(const glsl_type *type);
1205 ir_function_signature *_read_invocation_intrinsic(const glsl_type *type);
1206 ir_function_signature *_read_invocation(const glsl_type *type);
1207
1208
1209 ir_function_signature *_invocation_interlock_intrinsic(
1210 builtin_available_predicate avail,
1211 enum ir_intrinsic_id id);
1212 ir_function_signature *_invocation_interlock(
1213 const char *intrinsic_name,
1214 builtin_available_predicate avail);
1215
1216 ir_function_signature *_shader_clock_intrinsic(builtin_available_predicate avail,
1217 const glsl_type *type);
1218 ir_function_signature *_shader_clock(builtin_available_predicate avail,
1219 const glsl_type *type);
1220
1221 ir_function_signature *_vote_intrinsic(builtin_available_predicate avail,
1222 enum ir_intrinsic_id id);
1223 ir_function_signature *_vote(const char *intrinsic_name,
1224 builtin_available_predicate avail);
1225
1226 ir_function_signature *_helper_invocation_intrinsic();
1227 ir_function_signature *_helper_invocation();
1228
1229 #undef B0
1230 #undef B1
1231 #undef B2
1232 #undef B3
1233 #undef BA1
1234 #undef BA2
1235 /** @} */
1236 };
1237
1238 enum image_function_flags {
1239 IMAGE_FUNCTION_EMIT_STUB = (1 << 0),
1240 IMAGE_FUNCTION_RETURNS_VOID = (1 << 1),
1241 IMAGE_FUNCTION_HAS_VECTOR_DATA_TYPE = (1 << 2),
1242 IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE = (1 << 3),
1243 IMAGE_FUNCTION_READ_ONLY = (1 << 4),
1244 IMAGE_FUNCTION_WRITE_ONLY = (1 << 5),
1245 IMAGE_FUNCTION_AVAIL_ATOMIC = (1 << 6),
1246 IMAGE_FUNCTION_MS_ONLY = (1 << 7),
1247 IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE = (1 << 8),
1248 IMAGE_FUNCTION_AVAIL_ATOMIC_ADD = (1 << 9),
1249 IMAGE_FUNCTION_EXT_ONLY = (1 << 10),
1250 };
1251
1252 } /* anonymous namespace */
1253
1254 /**
1255 * Core builtin_builder functionality:
1256 * @{
1257 */
1258 builtin_builder::builtin_builder()
1259 : shader(NULL)
1260 {
1261 mem_ctx = NULL;
1262 }
1263
1264 builtin_builder::~builtin_builder()
1265 {
1266 ralloc_free(mem_ctx);
1267 }
1268
1269 ir_function_signature *
1270 builtin_builder::find(_mesa_glsl_parse_state *state,
1271 const char *name, exec_list *actual_parameters)
1272 {
1273 /* The shader currently being compiled requested a built-in function;
1274 * it needs to link against builtin_builder::shader in order to get them.
1275 *
1276 * Even if we don't find a matching signature, we still need to do this so
1277 * that the "no matching signature" error will list potential candidates
1278 * from the available built-ins.
1279 */
1280 state->uses_builtin_functions = true;
1281
1282 ir_function *f = shader->symbols->get_function(name);
1283 if (f == NULL)
1284 return NULL;
1285
1286 ir_function_signature *sig =
1287 f->matching_signature(state, actual_parameters, true);
1288 if (sig == NULL)
1289 return NULL;
1290
1291 return sig;
1292 }
1293
1294 void
1295 builtin_builder::initialize()
1296 {
1297 /* If already initialized, don't do it again. */
1298 if (mem_ctx != NULL)
1299 return;
1300
1301 glsl_type_singleton_init_or_ref();
1302
1303 mem_ctx = ralloc_context(NULL);
1304 create_shader();
1305 create_intrinsics();
1306 create_builtins();
1307 }
1308
1309 void
1310 builtin_builder::release()
1311 {
1312 ralloc_free(mem_ctx);
1313 mem_ctx = NULL;
1314
1315 ralloc_free(shader);
1316 shader = NULL;
1317
1318 glsl_type_singleton_decref();
1319 }
1320
1321 void
1322 builtin_builder::create_shader()
1323 {
1324 /* The target doesn't actually matter. There's no target for generic
1325 * GLSL utility code that could be linked against any stage, so just
1326 * arbitrarily pick GL_VERTEX_SHADER.
1327 */
1328 shader = _mesa_new_shader(0, MESA_SHADER_VERTEX);
1329 shader->symbols = new(mem_ctx) glsl_symbol_table;
1330 }
1331
1332 /** @} */
1333
1334 /**
1335 * Create ir_function and ir_function_signature objects for each
1336 * intrinsic.
1337 */
1338 void
1339 builtin_builder::create_intrinsics()
1340 {
1341 add_function("__intrinsic_atomic_read",
1342 _atomic_counter_intrinsic(shader_atomic_counters,
1343 ir_intrinsic_atomic_counter_read),
1344 NULL);
1345 add_function("__intrinsic_atomic_increment",
1346 _atomic_counter_intrinsic(shader_atomic_counters,
1347 ir_intrinsic_atomic_counter_increment),
1348 NULL);
1349 add_function("__intrinsic_atomic_predecrement",
1350 _atomic_counter_intrinsic(shader_atomic_counters,
1351 ir_intrinsic_atomic_counter_predecrement),
1352 NULL);
1353
1354 add_function("__intrinsic_atomic_add",
1355 _atomic_intrinsic2(buffer_atomics_supported,
1356 glsl_type::uint_type,
1357 ir_intrinsic_generic_atomic_add),
1358 _atomic_intrinsic2(buffer_atomics_supported,
1359 glsl_type::int_type,
1360 ir_intrinsic_generic_atomic_add),
1361 _atomic_intrinsic2(NV_shader_atomic_float_supported,
1362 glsl_type::float_type,
1363 ir_intrinsic_generic_atomic_add),
1364 _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
1365 ir_intrinsic_atomic_counter_add),
1366 NULL);
1367 add_function("__intrinsic_atomic_min",
1368 _atomic_intrinsic2(buffer_atomics_supported,
1369 glsl_type::uint_type,
1370 ir_intrinsic_generic_atomic_min),
1371 _atomic_intrinsic2(buffer_atomics_supported,
1372 glsl_type::int_type,
1373 ir_intrinsic_generic_atomic_min),
1374 _atomic_intrinsic2(INTEL_shader_atomic_float_minmax_supported,
1375 glsl_type::float_type,
1376 ir_intrinsic_generic_atomic_min),
1377 _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
1378 ir_intrinsic_atomic_counter_min),
1379 NULL);
1380 add_function("__intrinsic_atomic_max",
1381 _atomic_intrinsic2(buffer_atomics_supported,
1382 glsl_type::uint_type,
1383 ir_intrinsic_generic_atomic_max),
1384 _atomic_intrinsic2(buffer_atomics_supported,
1385 glsl_type::int_type,
1386 ir_intrinsic_generic_atomic_max),
1387 _atomic_intrinsic2(INTEL_shader_atomic_float_minmax_supported,
1388 glsl_type::float_type,
1389 ir_intrinsic_generic_atomic_max),
1390 _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
1391 ir_intrinsic_atomic_counter_max),
1392 NULL);
1393 add_function("__intrinsic_atomic_and",
1394 _atomic_intrinsic2(buffer_atomics_supported,
1395 glsl_type::uint_type,
1396 ir_intrinsic_generic_atomic_and),
1397 _atomic_intrinsic2(buffer_atomics_supported,
1398 glsl_type::int_type,
1399 ir_intrinsic_generic_atomic_and),
1400 _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
1401 ir_intrinsic_atomic_counter_and),
1402 NULL);
1403 add_function("__intrinsic_atomic_or",
1404 _atomic_intrinsic2(buffer_atomics_supported,
1405 glsl_type::uint_type,
1406 ir_intrinsic_generic_atomic_or),
1407 _atomic_intrinsic2(buffer_atomics_supported,
1408 glsl_type::int_type,
1409 ir_intrinsic_generic_atomic_or),
1410 _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
1411 ir_intrinsic_atomic_counter_or),
1412 NULL);
1413 add_function("__intrinsic_atomic_xor",
1414 _atomic_intrinsic2(buffer_atomics_supported,
1415 glsl_type::uint_type,
1416 ir_intrinsic_generic_atomic_xor),
1417 _atomic_intrinsic2(buffer_atomics_supported,
1418 glsl_type::int_type,
1419 ir_intrinsic_generic_atomic_xor),
1420 _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
1421 ir_intrinsic_atomic_counter_xor),
1422 NULL);
1423 add_function("__intrinsic_atomic_exchange",
1424 _atomic_intrinsic2(buffer_atomics_supported,
1425 glsl_type::uint_type,
1426 ir_intrinsic_generic_atomic_exchange),
1427 _atomic_intrinsic2(buffer_atomics_supported,
1428 glsl_type::int_type,
1429 ir_intrinsic_generic_atomic_exchange),
1430 _atomic_intrinsic2(NV_shader_atomic_float_supported,
1431 glsl_type::float_type,
1432 ir_intrinsic_generic_atomic_exchange),
1433 _atomic_counter_intrinsic1(shader_atomic_counter_ops_or_v460_desktop,
1434 ir_intrinsic_atomic_counter_exchange),
1435 NULL);
1436 add_function("__intrinsic_atomic_comp_swap",
1437 _atomic_intrinsic3(buffer_atomics_supported,
1438 glsl_type::uint_type,
1439 ir_intrinsic_generic_atomic_comp_swap),
1440 _atomic_intrinsic3(buffer_atomics_supported,
1441 glsl_type::int_type,
1442 ir_intrinsic_generic_atomic_comp_swap),
1443 _atomic_intrinsic3(INTEL_shader_atomic_float_minmax_supported,
1444 glsl_type::float_type,
1445 ir_intrinsic_generic_atomic_comp_swap),
1446 _atomic_counter_intrinsic2(shader_atomic_counter_ops_or_v460_desktop,
1447 ir_intrinsic_atomic_counter_comp_swap),
1448 NULL);
1449
1450 add_image_functions(false);
1451
1452 add_function("__intrinsic_memory_barrier",
1453 _memory_barrier_intrinsic(shader_image_load_store,
1454 ir_intrinsic_memory_barrier),
1455 NULL);
1456 add_function("__intrinsic_group_memory_barrier",
1457 _memory_barrier_intrinsic(compute_shader,
1458 ir_intrinsic_group_memory_barrier),
1459 NULL);
1460 add_function("__intrinsic_memory_barrier_atomic_counter",
1461 _memory_barrier_intrinsic(compute_shader_supported,
1462 ir_intrinsic_memory_barrier_atomic_counter),
1463 NULL);
1464 add_function("__intrinsic_memory_barrier_buffer",
1465 _memory_barrier_intrinsic(compute_shader_supported,
1466 ir_intrinsic_memory_barrier_buffer),
1467 NULL);
1468 add_function("__intrinsic_memory_barrier_image",
1469 _memory_barrier_intrinsic(compute_shader_supported,
1470 ir_intrinsic_memory_barrier_image),
1471 NULL);
1472 add_function("__intrinsic_memory_barrier_shared",
1473 _memory_barrier_intrinsic(compute_shader,
1474 ir_intrinsic_memory_barrier_shared),
1475 NULL);
1476
1477 add_function("__intrinsic_begin_invocation_interlock",
1478 _invocation_interlock_intrinsic(
1479 supports_arb_fragment_shader_interlock,
1480 ir_intrinsic_begin_invocation_interlock), NULL);
1481
1482 add_function("__intrinsic_end_invocation_interlock",
1483 _invocation_interlock_intrinsic(
1484 supports_arb_fragment_shader_interlock,
1485 ir_intrinsic_end_invocation_interlock), NULL);
1486
1487 add_function("__intrinsic_shader_clock",
1488 _shader_clock_intrinsic(shader_clock,
1489 glsl_type::uvec2_type),
1490 NULL);
1491
1492 add_function("__intrinsic_vote_all",
1493 _vote_intrinsic(vote_or_v460_desktop, ir_intrinsic_vote_all),
1494 NULL);
1495 add_function("__intrinsic_vote_any",
1496 _vote_intrinsic(vote_or_v460_desktop, ir_intrinsic_vote_any),
1497 NULL);
1498 add_function("__intrinsic_vote_eq",
1499 _vote_intrinsic(vote_or_v460_desktop, ir_intrinsic_vote_eq),
1500 NULL);
1501
1502 add_function("__intrinsic_ballot", _ballot_intrinsic(), NULL);
1503
1504 add_function("__intrinsic_read_invocation",
1505 _read_invocation_intrinsic(glsl_type::float_type),
1506 _read_invocation_intrinsic(glsl_type::vec2_type),
1507 _read_invocation_intrinsic(glsl_type::vec3_type),
1508 _read_invocation_intrinsic(glsl_type::vec4_type),
1509
1510 _read_invocation_intrinsic(glsl_type::int_type),
1511 _read_invocation_intrinsic(glsl_type::ivec2_type),
1512 _read_invocation_intrinsic(glsl_type::ivec3_type),
1513 _read_invocation_intrinsic(glsl_type::ivec4_type),
1514
1515 _read_invocation_intrinsic(glsl_type::uint_type),
1516 _read_invocation_intrinsic(glsl_type::uvec2_type),
1517 _read_invocation_intrinsic(glsl_type::uvec3_type),
1518 _read_invocation_intrinsic(glsl_type::uvec4_type),
1519 NULL);
1520
1521 add_function("__intrinsic_read_first_invocation",
1522 _read_first_invocation_intrinsic(glsl_type::float_type),
1523 _read_first_invocation_intrinsic(glsl_type::vec2_type),
1524 _read_first_invocation_intrinsic(glsl_type::vec3_type),
1525 _read_first_invocation_intrinsic(glsl_type::vec4_type),
1526
1527 _read_first_invocation_intrinsic(glsl_type::int_type),
1528 _read_first_invocation_intrinsic(glsl_type::ivec2_type),
1529 _read_first_invocation_intrinsic(glsl_type::ivec3_type),
1530 _read_first_invocation_intrinsic(glsl_type::ivec4_type),
1531
1532 _read_first_invocation_intrinsic(glsl_type::uint_type),
1533 _read_first_invocation_intrinsic(glsl_type::uvec2_type),
1534 _read_first_invocation_intrinsic(glsl_type::uvec3_type),
1535 _read_first_invocation_intrinsic(glsl_type::uvec4_type),
1536 NULL);
1537
1538 add_function("__intrinsic_helper_invocation",
1539 _helper_invocation_intrinsic(), NULL);
1540 }
1541
1542 /**
1543 * Create ir_function and ir_function_signature objects for each built-in.
1544 *
1545 * Contains a list of every available built-in.
1546 */
1547 void
1548 builtin_builder::create_builtins()
1549 {
1550 #define F(NAME) \
1551 add_function(#NAME, \
1552 _##NAME(glsl_type::float_type), \
1553 _##NAME(glsl_type::vec2_type), \
1554 _##NAME(glsl_type::vec3_type), \
1555 _##NAME(glsl_type::vec4_type), \
1556 NULL);
1557
1558 #define FD(NAME) \
1559 add_function(#NAME, \
1560 _##NAME(always_available, glsl_type::float_type), \
1561 _##NAME(always_available, glsl_type::vec2_type), \
1562 _##NAME(always_available, glsl_type::vec3_type), \
1563 _##NAME(always_available, glsl_type::vec4_type), \
1564 _##NAME(fp64, glsl_type::double_type), \
1565 _##NAME(fp64, glsl_type::dvec2_type), \
1566 _##NAME(fp64, glsl_type::dvec3_type), \
1567 _##NAME(fp64, glsl_type::dvec4_type), \
1568 NULL);
1569
1570 #define FD130(NAME) \
1571 add_function(#NAME, \
1572 _##NAME(v130, glsl_type::float_type), \
1573 _##NAME(v130, glsl_type::vec2_type), \
1574 _##NAME(v130, glsl_type::vec3_type), \
1575 _##NAME(v130, glsl_type::vec4_type), \
1576 _##NAME(fp64, glsl_type::double_type), \
1577 _##NAME(fp64, glsl_type::dvec2_type), \
1578 _##NAME(fp64, glsl_type::dvec3_type), \
1579 _##NAME(fp64, glsl_type::dvec4_type), \
1580 NULL);
1581
1582 #define FDGS5(NAME) \
1583 add_function(#NAME, \
1584 _##NAME(gpu_shader5_es, glsl_type::float_type), \
1585 _##NAME(gpu_shader5_es, glsl_type::vec2_type), \
1586 _##NAME(gpu_shader5_es, glsl_type::vec3_type), \
1587 _##NAME(gpu_shader5_es, glsl_type::vec4_type), \
1588 _##NAME(fp64, glsl_type::double_type), \
1589 _##NAME(fp64, glsl_type::dvec2_type), \
1590 _##NAME(fp64, glsl_type::dvec3_type), \
1591 _##NAME(fp64, glsl_type::dvec4_type), \
1592 NULL);
1593
1594 #define FI(NAME) \
1595 add_function(#NAME, \
1596 _##NAME(glsl_type::float_type), \
1597 _##NAME(glsl_type::vec2_type), \
1598 _##NAME(glsl_type::vec3_type), \
1599 _##NAME(glsl_type::vec4_type), \
1600 _##NAME(glsl_type::int_type), \
1601 _##NAME(glsl_type::ivec2_type), \
1602 _##NAME(glsl_type::ivec3_type), \
1603 _##NAME(glsl_type::ivec4_type), \
1604 NULL);
1605
1606 #define FI64(NAME) \
1607 add_function(#NAME, \
1608 _##NAME(always_available, glsl_type::float_type), \
1609 _##NAME(always_available, glsl_type::vec2_type), \
1610 _##NAME(always_available, glsl_type::vec3_type), \
1611 _##NAME(always_available, glsl_type::vec4_type), \
1612 _##NAME(always_available, glsl_type::int_type), \
1613 _##NAME(always_available, glsl_type::ivec2_type), \
1614 _##NAME(always_available, glsl_type::ivec3_type), \
1615 _##NAME(always_available, glsl_type::ivec4_type), \
1616 _##NAME(fp64, glsl_type::double_type), \
1617 _##NAME(fp64, glsl_type::dvec2_type), \
1618 _##NAME(fp64, glsl_type::dvec3_type), \
1619 _##NAME(fp64, glsl_type::dvec4_type), \
1620 _##NAME(int64, glsl_type::int64_t_type), \
1621 _##NAME(int64, glsl_type::i64vec2_type), \
1622 _##NAME(int64, glsl_type::i64vec3_type), \
1623 _##NAME(int64, glsl_type::i64vec4_type), \
1624 NULL);
1625
1626 #define FIUD_VEC(NAME) \
1627 add_function(#NAME, \
1628 _##NAME(always_available, glsl_type::vec2_type), \
1629 _##NAME(always_available, glsl_type::vec3_type), \
1630 _##NAME(always_available, glsl_type::vec4_type), \
1631 \
1632 _##NAME(always_available, glsl_type::ivec2_type), \
1633 _##NAME(always_available, glsl_type::ivec3_type), \
1634 _##NAME(always_available, glsl_type::ivec4_type), \
1635 \
1636 _##NAME(v130_or_gpu_shader4, glsl_type::uvec2_type), \
1637 _##NAME(v130_or_gpu_shader4, glsl_type::uvec3_type), \
1638 _##NAME(v130_or_gpu_shader4, glsl_type::uvec4_type), \
1639 _##NAME(fp64, glsl_type::dvec2_type), \
1640 _##NAME(fp64, glsl_type::dvec3_type), \
1641 _##NAME(fp64, glsl_type::dvec4_type), \
1642 _##NAME(int64, glsl_type::int64_t_type), \
1643 _##NAME(int64, glsl_type::i64vec2_type), \
1644 _##NAME(int64, glsl_type::i64vec3_type), \
1645 _##NAME(int64, glsl_type::i64vec4_type), \
1646 _##NAME(int64, glsl_type::uint64_t_type), \
1647 _##NAME(int64, glsl_type::u64vec2_type), \
1648 _##NAME(int64, glsl_type::u64vec3_type), \
1649 _##NAME(int64, glsl_type::u64vec4_type), \
1650 NULL);
1651
1652 #define IU(NAME) \
1653 add_function(#NAME, \
1654 _##NAME(glsl_type::int_type), \
1655 _##NAME(glsl_type::ivec2_type), \
1656 _##NAME(glsl_type::ivec3_type), \
1657 _##NAME(glsl_type::ivec4_type), \
1658 \
1659 _##NAME(glsl_type::uint_type), \
1660 _##NAME(glsl_type::uvec2_type), \
1661 _##NAME(glsl_type::uvec3_type), \
1662 _##NAME(glsl_type::uvec4_type), \
1663 NULL);
1664
1665 #define FIUBD_VEC(NAME) \
1666 add_function(#NAME, \
1667 _##NAME(always_available, glsl_type::vec2_type), \
1668 _##NAME(always_available, glsl_type::vec3_type), \
1669 _##NAME(always_available, glsl_type::vec4_type), \
1670 \
1671 _##NAME(always_available, glsl_type::ivec2_type), \
1672 _##NAME(always_available, glsl_type::ivec3_type), \
1673 _##NAME(always_available, glsl_type::ivec4_type), \
1674 \
1675 _##NAME(v130_or_gpu_shader4, glsl_type::uvec2_type), \
1676 _##NAME(v130_or_gpu_shader4, glsl_type::uvec3_type), \
1677 _##NAME(v130_or_gpu_shader4, glsl_type::uvec4_type), \
1678 \
1679 _##NAME(always_available, glsl_type::bvec2_type), \
1680 _##NAME(always_available, glsl_type::bvec3_type), \
1681 _##NAME(always_available, glsl_type::bvec4_type), \
1682 \
1683 _##NAME(fp64, glsl_type::dvec2_type), \
1684 _##NAME(fp64, glsl_type::dvec3_type), \
1685 _##NAME(fp64, glsl_type::dvec4_type), \
1686 _##NAME(int64, glsl_type::int64_t_type), \
1687 _##NAME(int64, glsl_type::i64vec2_type), \
1688 _##NAME(int64, glsl_type::i64vec3_type), \
1689 _##NAME(int64, glsl_type::i64vec4_type), \
1690 _##NAME(int64, glsl_type::uint64_t_type), \
1691 _##NAME(int64, glsl_type::u64vec2_type), \
1692 _##NAME(int64, glsl_type::u64vec3_type), \
1693 _##NAME(int64, glsl_type::u64vec4_type), \
1694 NULL);
1695
1696 #define FIUD2_MIXED(NAME) \
1697 add_function(#NAME, \
1698 _##NAME(always_available, glsl_type::float_type, glsl_type::float_type), \
1699 _##NAME(always_available, glsl_type::vec2_type, glsl_type::float_type), \
1700 _##NAME(always_available, glsl_type::vec3_type, glsl_type::float_type), \
1701 _##NAME(always_available, glsl_type::vec4_type, glsl_type::float_type), \
1702 \
1703 _##NAME(always_available, glsl_type::vec2_type, glsl_type::vec2_type), \
1704 _##NAME(always_available, glsl_type::vec3_type, glsl_type::vec3_type), \
1705 _##NAME(always_available, glsl_type::vec4_type, glsl_type::vec4_type), \
1706 \
1707 _##NAME(always_available, glsl_type::int_type, glsl_type::int_type), \
1708 _##NAME(always_available, glsl_type::ivec2_type, glsl_type::int_type), \
1709 _##NAME(always_available, glsl_type::ivec3_type, glsl_type::int_type), \
1710 _##NAME(always_available, glsl_type::ivec4_type, glsl_type::int_type), \
1711 \
1712 _##NAME(always_available, glsl_type::ivec2_type, glsl_type::ivec2_type), \
1713 _##NAME(always_available, glsl_type::ivec3_type, glsl_type::ivec3_type), \
1714 _##NAME(always_available, glsl_type::ivec4_type, glsl_type::ivec4_type), \
1715 \
1716 _##NAME(v130_or_gpu_shader4, glsl_type::uint_type, glsl_type::uint_type), \
1717 _##NAME(v130_or_gpu_shader4, glsl_type::uvec2_type, glsl_type::uint_type), \
1718 _##NAME(v130_or_gpu_shader4, glsl_type::uvec3_type, glsl_type::uint_type), \
1719 _##NAME(v130_or_gpu_shader4, glsl_type::uvec4_type, glsl_type::uint_type), \
1720 \
1721 _##NAME(v130_or_gpu_shader4, glsl_type::uvec2_type, glsl_type::uvec2_type), \
1722 _##NAME(v130_or_gpu_shader4, glsl_type::uvec3_type, glsl_type::uvec3_type), \
1723 _##NAME(v130_or_gpu_shader4, glsl_type::uvec4_type, glsl_type::uvec4_type), \
1724 \
1725 _##NAME(fp64, glsl_type::double_type, glsl_type::double_type), \
1726 _##NAME(fp64, glsl_type::dvec2_type, glsl_type::double_type), \
1727 _##NAME(fp64, glsl_type::dvec3_type, glsl_type::double_type), \
1728 _##NAME(fp64, glsl_type::dvec4_type, glsl_type::double_type), \
1729 _##NAME(fp64, glsl_type::dvec2_type, glsl_type::dvec2_type), \
1730 _##NAME(fp64, glsl_type::dvec3_type, glsl_type::dvec3_type), \
1731 _##NAME(fp64, glsl_type::dvec4_type, glsl_type::dvec4_type), \
1732 \
1733 _##NAME(int64, glsl_type::int64_t_type, glsl_type::int64_t_type), \
1734 _##NAME(int64, glsl_type::i64vec2_type, glsl_type::int64_t_type), \
1735 _##NAME(int64, glsl_type::i64vec3_type, glsl_type::int64_t_type), \
1736 _##NAME(int64, glsl_type::i64vec4_type, glsl_type::int64_t_type), \
1737 _##NAME(int64, glsl_type::i64vec2_type, glsl_type::i64vec2_type), \
1738 _##NAME(int64, glsl_type::i64vec3_type, glsl_type::i64vec3_type), \
1739 _##NAME(int64, glsl_type::i64vec4_type, glsl_type::i64vec4_type), \
1740 _##NAME(int64, glsl_type::uint64_t_type, glsl_type::uint64_t_type), \
1741 _##NAME(int64, glsl_type::u64vec2_type, glsl_type::uint64_t_type), \
1742 _##NAME(int64, glsl_type::u64vec3_type, glsl_type::uint64_t_type), \
1743 _##NAME(int64, glsl_type::u64vec4_type, glsl_type::uint64_t_type), \
1744 _##NAME(int64, glsl_type::u64vec2_type, glsl_type::u64vec2_type), \
1745 _##NAME(int64, glsl_type::u64vec3_type, glsl_type::u64vec3_type), \
1746 _##NAME(int64, glsl_type::u64vec4_type, glsl_type::u64vec4_type), \
1747 NULL);
1748
1749 F(radians)
1750 F(degrees)
1751 F(sin)
1752 F(cos)
1753 F(tan)
1754 F(asin)
1755 F(acos)
1756
1757 add_function("atan",
1758 _atan(glsl_type::float_type),
1759 _atan(glsl_type::vec2_type),
1760 _atan(glsl_type::vec3_type),
1761 _atan(glsl_type::vec4_type),
1762 _atan2(glsl_type::float_type),
1763 _atan2(glsl_type::vec2_type),
1764 _atan2(glsl_type::vec3_type),
1765 _atan2(glsl_type::vec4_type),
1766 _atan_op(glsl_type::float_type),
1767 _atan_op(glsl_type::vec2_type),
1768 _atan_op(glsl_type::vec3_type),
1769 _atan_op(glsl_type::vec4_type),
1770 _atan2_op(glsl_type::float_type),
1771 _atan2_op(glsl_type::vec2_type),
1772 _atan2_op(glsl_type::vec3_type),
1773 _atan2_op(glsl_type::vec4_type),
1774 NULL);
1775
1776 F(sinh)
1777 F(cosh)
1778 F(tanh)
1779 F(asinh)
1780 F(acosh)
1781 F(atanh)
1782 F(pow)
1783 F(exp)
1784 F(log)
1785 F(exp2)
1786 F(log2)
1787 FD(sqrt)
1788 FD(inversesqrt)
1789 FI64(abs)
1790 FI64(sign)
1791 FD(floor)
1792 FD(trunc)
1793 FD(round)
1794 FD(roundEven)
1795 FD(ceil)
1796 FD(fract)
1797
1798 add_function("truncate",
1799 _truncate(gpu_shader4, glsl_type::float_type),
1800 _truncate(gpu_shader4, glsl_type::vec2_type),
1801 _truncate(gpu_shader4, glsl_type::vec3_type),
1802 _truncate(gpu_shader4, glsl_type::vec4_type),
1803 NULL);
1804
1805
1806 add_function("mod",
1807 _mod(always_available, glsl_type::float_type, glsl_type::float_type),
1808 _mod(always_available, glsl_type::vec2_type, glsl_type::float_type),
1809 _mod(always_available, glsl_type::vec3_type, glsl_type::float_type),
1810 _mod(always_available, glsl_type::vec4_type, glsl_type::float_type),
1811
1812 _mod(always_available, glsl_type::vec2_type, glsl_type::vec2_type),
1813 _mod(always_available, glsl_type::vec3_type, glsl_type::vec3_type),
1814 _mod(always_available, glsl_type::vec4_type, glsl_type::vec4_type),
1815
1816 _mod(fp64, glsl_type::double_type, glsl_type::double_type),
1817 _mod(fp64, glsl_type::dvec2_type, glsl_type::double_type),
1818 _mod(fp64, glsl_type::dvec3_type, glsl_type::double_type),
1819 _mod(fp64, glsl_type::dvec4_type, glsl_type::double_type),
1820
1821 _mod(fp64, glsl_type::dvec2_type, glsl_type::dvec2_type),
1822 _mod(fp64, glsl_type::dvec3_type, glsl_type::dvec3_type),
1823 _mod(fp64, glsl_type::dvec4_type, glsl_type::dvec4_type),
1824 NULL);
1825
1826 FD(modf)
1827
1828 FIUD2_MIXED(min)
1829 FIUD2_MIXED(max)
1830 FIUD2_MIXED(clamp)
1831
1832 add_function("mix",
1833 _mix_lrp(always_available, glsl_type::float_type, glsl_type::float_type),
1834 _mix_lrp(always_available, glsl_type::vec2_type, glsl_type::float_type),
1835 _mix_lrp(always_available, glsl_type::vec3_type, glsl_type::float_type),
1836 _mix_lrp(always_available, glsl_type::vec4_type, glsl_type::float_type),
1837
1838 _mix_lrp(always_available, glsl_type::vec2_type, glsl_type::vec2_type),
1839 _mix_lrp(always_available, glsl_type::vec3_type, glsl_type::vec3_type),
1840 _mix_lrp(always_available, glsl_type::vec4_type, glsl_type::vec4_type),
1841
1842 _mix_lrp(fp64, glsl_type::double_type, glsl_type::double_type),
1843 _mix_lrp(fp64, glsl_type::dvec2_type, glsl_type::double_type),
1844 _mix_lrp(fp64, glsl_type::dvec3_type, glsl_type::double_type),
1845 _mix_lrp(fp64, glsl_type::dvec4_type, glsl_type::double_type),
1846
1847 _mix_lrp(fp64, glsl_type::dvec2_type, glsl_type::dvec2_type),
1848 _mix_lrp(fp64, glsl_type::dvec3_type, glsl_type::dvec3_type),
1849 _mix_lrp(fp64, glsl_type::dvec4_type, glsl_type::dvec4_type),
1850
1851 _mix_sel(v130, glsl_type::float_type, glsl_type::bool_type),
1852 _mix_sel(v130, glsl_type::vec2_type, glsl_type::bvec2_type),
1853 _mix_sel(v130, glsl_type::vec3_type, glsl_type::bvec3_type),
1854 _mix_sel(v130, glsl_type::vec4_type, glsl_type::bvec4_type),
1855
1856 _mix_sel(fp64, glsl_type::double_type, glsl_type::bool_type),
1857 _mix_sel(fp64, glsl_type::dvec2_type, glsl_type::bvec2_type),
1858 _mix_sel(fp64, glsl_type::dvec3_type, glsl_type::bvec3_type),
1859 _mix_sel(fp64, glsl_type::dvec4_type, glsl_type::bvec4_type),
1860
1861 _mix_sel(shader_integer_mix, glsl_type::int_type, glsl_type::bool_type),
1862 _mix_sel(shader_integer_mix, glsl_type::ivec2_type, glsl_type::bvec2_type),
1863 _mix_sel(shader_integer_mix, glsl_type::ivec3_type, glsl_type::bvec3_type),
1864 _mix_sel(shader_integer_mix, glsl_type::ivec4_type, glsl_type::bvec4_type),
1865
1866 _mix_sel(shader_integer_mix, glsl_type::uint_type, glsl_type::bool_type),
1867 _mix_sel(shader_integer_mix, glsl_type::uvec2_type, glsl_type::bvec2_type),
1868 _mix_sel(shader_integer_mix, glsl_type::uvec3_type, glsl_type::bvec3_type),
1869 _mix_sel(shader_integer_mix, glsl_type::uvec4_type, glsl_type::bvec4_type),
1870
1871 _mix_sel(shader_integer_mix, glsl_type::bool_type, glsl_type::bool_type),
1872 _mix_sel(shader_integer_mix, glsl_type::bvec2_type, glsl_type::bvec2_type),
1873 _mix_sel(shader_integer_mix, glsl_type::bvec3_type, glsl_type::bvec3_type),
1874 _mix_sel(shader_integer_mix, glsl_type::bvec4_type, glsl_type::bvec4_type),
1875
1876 _mix_sel(int64, glsl_type::int64_t_type, glsl_type::bool_type),
1877 _mix_sel(int64, glsl_type::i64vec2_type, glsl_type::bvec2_type),
1878 _mix_sel(int64, glsl_type::i64vec3_type, glsl_type::bvec3_type),
1879 _mix_sel(int64, glsl_type::i64vec4_type, glsl_type::bvec4_type),
1880
1881 _mix_sel(int64, glsl_type::uint64_t_type, glsl_type::bool_type),
1882 _mix_sel(int64, glsl_type::u64vec2_type, glsl_type::bvec2_type),
1883 _mix_sel(int64, glsl_type::u64vec3_type, glsl_type::bvec3_type),
1884 _mix_sel(int64, glsl_type::u64vec4_type, glsl_type::bvec4_type),
1885 NULL);
1886
1887 add_function("step",
1888 _step(always_available, glsl_type::float_type, glsl_type::float_type),
1889 _step(always_available, glsl_type::float_type, glsl_type::vec2_type),
1890 _step(always_available, glsl_type::float_type, glsl_type::vec3_type),
1891 _step(always_available, glsl_type::float_type, glsl_type::vec4_type),
1892
1893 _step(always_available, glsl_type::vec2_type, glsl_type::vec2_type),
1894 _step(always_available, glsl_type::vec3_type, glsl_type::vec3_type),
1895 _step(always_available, glsl_type::vec4_type, glsl_type::vec4_type),
1896 _step(fp64, glsl_type::double_type, glsl_type::double_type),
1897 _step(fp64, glsl_type::double_type, glsl_type::dvec2_type),
1898 _step(fp64, glsl_type::double_type, glsl_type::dvec3_type),
1899 _step(fp64, glsl_type::double_type, glsl_type::dvec4_type),
1900
1901 _step(fp64, glsl_type::dvec2_type, glsl_type::dvec2_type),
1902 _step(fp64, glsl_type::dvec3_type, glsl_type::dvec3_type),
1903 _step(fp64, glsl_type::dvec4_type, glsl_type::dvec4_type),
1904 NULL);
1905
1906 add_function("smoothstep",
1907 _smoothstep(always_available, glsl_type::float_type, glsl_type::float_type),
1908 _smoothstep(always_available, glsl_type::float_type, glsl_type::vec2_type),
1909 _smoothstep(always_available, glsl_type::float_type, glsl_type::vec3_type),
1910 _smoothstep(always_available, glsl_type::float_type, glsl_type::vec4_type),
1911
1912 _smoothstep(always_available, glsl_type::vec2_type, glsl_type::vec2_type),
1913 _smoothstep(always_available, glsl_type::vec3_type, glsl_type::vec3_type),
1914 _smoothstep(always_available, glsl_type::vec4_type, glsl_type::vec4_type),
1915 _smoothstep(fp64, glsl_type::double_type, glsl_type::double_type),
1916 _smoothstep(fp64, glsl_type::double_type, glsl_type::dvec2_type),
1917 _smoothstep(fp64, glsl_type::double_type, glsl_type::dvec3_type),
1918 _smoothstep(fp64, glsl_type::double_type, glsl_type::dvec4_type),
1919
1920 _smoothstep(fp64, glsl_type::dvec2_type, glsl_type::dvec2_type),
1921 _smoothstep(fp64, glsl_type::dvec3_type, glsl_type::dvec3_type),
1922 _smoothstep(fp64, glsl_type::dvec4_type, glsl_type::dvec4_type),
1923 NULL);
1924
1925 FD130(isnan)
1926 FD130(isinf)
1927
1928 F(floatBitsToInt)
1929 F(floatBitsToUint)
1930 add_function("intBitsToFloat",
1931 _intBitsToFloat(glsl_type::int_type),
1932 _intBitsToFloat(glsl_type::ivec2_type),
1933 _intBitsToFloat(glsl_type::ivec3_type),
1934 _intBitsToFloat(glsl_type::ivec4_type),
1935 NULL);
1936 add_function("uintBitsToFloat",
1937 _uintBitsToFloat(glsl_type::uint_type),
1938 _uintBitsToFloat(glsl_type::uvec2_type),
1939 _uintBitsToFloat(glsl_type::uvec3_type),
1940 _uintBitsToFloat(glsl_type::uvec4_type),
1941 NULL);
1942
1943 add_function("doubleBitsToInt64",
1944 _doubleBitsToInt64(int64_fp64, glsl_type::double_type),
1945 _doubleBitsToInt64(int64_fp64, glsl_type::dvec2_type),
1946 _doubleBitsToInt64(int64_fp64, glsl_type::dvec3_type),
1947 _doubleBitsToInt64(int64_fp64, glsl_type::dvec4_type),
1948 NULL);
1949
1950 add_function("doubleBitsToUint64",
1951 _doubleBitsToUint64(int64_fp64, glsl_type::double_type),
1952 _doubleBitsToUint64(int64_fp64, glsl_type::dvec2_type),
1953 _doubleBitsToUint64(int64_fp64, glsl_type::dvec3_type),
1954 _doubleBitsToUint64(int64_fp64, glsl_type::dvec4_type),
1955 NULL);
1956
1957 add_function("int64BitsToDouble",
1958 _int64BitsToDouble(int64_fp64, glsl_type::int64_t_type),
1959 _int64BitsToDouble(int64_fp64, glsl_type::i64vec2_type),
1960 _int64BitsToDouble(int64_fp64, glsl_type::i64vec3_type),
1961 _int64BitsToDouble(int64_fp64, glsl_type::i64vec4_type),
1962 NULL);
1963
1964 add_function("uint64BitsToDouble",
1965 _uint64BitsToDouble(int64_fp64, glsl_type::uint64_t_type),
1966 _uint64BitsToDouble(int64_fp64, glsl_type::u64vec2_type),
1967 _uint64BitsToDouble(int64_fp64, glsl_type::u64vec3_type),
1968 _uint64BitsToDouble(int64_fp64, glsl_type::u64vec4_type),
1969 NULL);
1970
1971 add_function("packUnorm2x16", _packUnorm2x16(shader_packing_or_es3_or_gpu_shader5), NULL);
1972 add_function("packSnorm2x16", _packSnorm2x16(shader_packing_or_es3), NULL);
1973 add_function("packUnorm4x8", _packUnorm4x8(shader_packing_or_es31_or_gpu_shader5), NULL);
1974 add_function("packSnorm4x8", _packSnorm4x8(shader_packing_or_es31_or_gpu_shader5), NULL);
1975 add_function("unpackUnorm2x16", _unpackUnorm2x16(shader_packing_or_es3_or_gpu_shader5), NULL);
1976 add_function("unpackSnorm2x16", _unpackSnorm2x16(shader_packing_or_es3), NULL);
1977 add_function("unpackUnorm4x8", _unpackUnorm4x8(shader_packing_or_es31_or_gpu_shader5), NULL);
1978 add_function("unpackSnorm4x8", _unpackSnorm4x8(shader_packing_or_es31_or_gpu_shader5), NULL);
1979 add_function("packHalf2x16", _packHalf2x16(shader_packing_or_es3), NULL);
1980 add_function("unpackHalf2x16", _unpackHalf2x16(shader_packing_or_es3), NULL);
1981 add_function("packDouble2x32", _packDouble2x32(fp64), NULL);
1982 add_function("unpackDouble2x32", _unpackDouble2x32(fp64), NULL);
1983
1984 add_function("packInt2x32", _packInt2x32(int64), NULL);
1985 add_function("unpackInt2x32", _unpackInt2x32(int64), NULL);
1986 add_function("packUint2x32", _packUint2x32(int64), NULL);
1987 add_function("unpackUint2x32", _unpackUint2x32(int64), NULL);
1988
1989 FD(length)
1990 FD(distance)
1991 FD(dot)
1992
1993 add_function("cross", _cross(always_available, glsl_type::vec3_type),
1994 _cross(fp64, glsl_type::dvec3_type), NULL);
1995
1996 FD(normalize)
1997 add_function("ftransform", _ftransform(), NULL);
1998 FD(faceforward)
1999 FD(reflect)
2000 FD(refract)
2001 // ...
2002 add_function("matrixCompMult",
2003 _matrixCompMult(always_available, glsl_type::mat2_type),
2004 _matrixCompMult(always_available, glsl_type::mat3_type),
2005 _matrixCompMult(always_available, glsl_type::mat4_type),
2006 _matrixCompMult(always_available, glsl_type::mat2x3_type),
2007 _matrixCompMult(always_available, glsl_type::mat2x4_type),
2008 _matrixCompMult(always_available, glsl_type::mat3x2_type),
2009 _matrixCompMult(always_available, glsl_type::mat3x4_type),
2010 _matrixCompMult(always_available, glsl_type::mat4x2_type),
2011 _matrixCompMult(always_available, glsl_type::mat4x3_type),
2012 _matrixCompMult(fp64, glsl_type::dmat2_type),
2013 _matrixCompMult(fp64, glsl_type::dmat3_type),
2014 _matrixCompMult(fp64, glsl_type::dmat4_type),
2015 _matrixCompMult(fp64, glsl_type::dmat2x3_type),
2016 _matrixCompMult(fp64, glsl_type::dmat2x4_type),
2017 _matrixCompMult(fp64, glsl_type::dmat3x2_type),
2018 _matrixCompMult(fp64, glsl_type::dmat3x4_type),
2019 _matrixCompMult(fp64, glsl_type::dmat4x2_type),
2020 _matrixCompMult(fp64, glsl_type::dmat4x3_type),
2021 NULL);
2022 add_function("outerProduct",
2023 _outerProduct(v120, glsl_type::mat2_type),
2024 _outerProduct(v120, glsl_type::mat3_type),
2025 _outerProduct(v120, glsl_type::mat4_type),
2026 _outerProduct(v120, glsl_type::mat2x3_type),
2027 _outerProduct(v120, glsl_type::mat2x4_type),
2028 _outerProduct(v120, glsl_type::mat3x2_type),
2029 _outerProduct(v120, glsl_type::mat3x4_type),
2030 _outerProduct(v120, glsl_type::mat4x2_type),
2031 _outerProduct(v120, glsl_type::mat4x3_type),
2032 _outerProduct(fp64, glsl_type::dmat2_type),
2033 _outerProduct(fp64, glsl_type::dmat3_type),
2034 _outerProduct(fp64, glsl_type::dmat4_type),
2035 _outerProduct(fp64, glsl_type::dmat2x3_type),
2036 _outerProduct(fp64, glsl_type::dmat2x4_type),
2037 _outerProduct(fp64, glsl_type::dmat3x2_type),
2038 _outerProduct(fp64, glsl_type::dmat3x4_type),
2039 _outerProduct(fp64, glsl_type::dmat4x2_type),
2040 _outerProduct(fp64, glsl_type::dmat4x3_type),
2041 NULL);
2042 add_function("determinant",
2043 _determinant_mat2(v120, glsl_type::mat2_type),
2044 _determinant_mat3(v120, glsl_type::mat3_type),
2045 _determinant_mat4(v120, glsl_type::mat4_type),
2046 _determinant_mat2(fp64, glsl_type::dmat2_type),
2047 _determinant_mat3(fp64, glsl_type::dmat3_type),
2048 _determinant_mat4(fp64, glsl_type::dmat4_type),
2049
2050 NULL);
2051 add_function("inverse",
2052 _inverse_mat2(v140_or_es3, glsl_type::mat2_type),
2053 _inverse_mat3(v140_or_es3, glsl_type::mat3_type),
2054 _inverse_mat4(v140_or_es3, glsl_type::mat4_type),
2055 _inverse_mat2(fp64, glsl_type::dmat2_type),
2056 _inverse_mat3(fp64, glsl_type::dmat3_type),
2057 _inverse_mat4(fp64, glsl_type::dmat4_type),
2058 NULL);
2059 add_function("transpose",
2060 _transpose(v120, glsl_type::mat2_type),
2061 _transpose(v120, glsl_type::mat3_type),
2062 _transpose(v120, glsl_type::mat4_type),
2063 _transpose(v120, glsl_type::mat2x3_type),
2064 _transpose(v120, glsl_type::mat2x4_type),
2065 _transpose(v120, glsl_type::mat3x2_type),
2066 _transpose(v120, glsl_type::mat3x4_type),
2067 _transpose(v120, glsl_type::mat4x2_type),
2068 _transpose(v120, glsl_type::mat4x3_type),
2069 _transpose(fp64, glsl_type::dmat2_type),
2070 _transpose(fp64, glsl_type::dmat3_type),
2071 _transpose(fp64, glsl_type::dmat4_type),
2072 _transpose(fp64, glsl_type::dmat2x3_type),
2073 _transpose(fp64, glsl_type::dmat2x4_type),
2074 _transpose(fp64, glsl_type::dmat3x2_type),
2075 _transpose(fp64, glsl_type::dmat3x4_type),
2076 _transpose(fp64, glsl_type::dmat4x2_type),
2077 _transpose(fp64, glsl_type::dmat4x3_type),
2078 NULL);
2079 FIUD_VEC(lessThan)
2080 FIUD_VEC(lessThanEqual)
2081 FIUD_VEC(greaterThan)
2082 FIUD_VEC(greaterThanEqual)
2083 FIUBD_VEC(notEqual)
2084 FIUBD_VEC(equal)
2085
2086 add_function("any",
2087 _any(glsl_type::bvec2_type),
2088 _any(glsl_type::bvec3_type),
2089 _any(glsl_type::bvec4_type),
2090 NULL);
2091
2092 add_function("all",
2093 _all(glsl_type::bvec2_type),
2094 _all(glsl_type::bvec3_type),
2095 _all(glsl_type::bvec4_type),
2096 NULL);
2097
2098 add_function("not",
2099 _not(glsl_type::bvec2_type),
2100 _not(glsl_type::bvec3_type),
2101 _not(glsl_type::bvec4_type),
2102 NULL);
2103
2104 add_function("textureSize",
2105 _textureSize(v130, glsl_type::int_type, glsl_type::sampler1D_type),
2106 _textureSize(v130, glsl_type::int_type, glsl_type::isampler1D_type),
2107 _textureSize(v130, glsl_type::int_type, glsl_type::usampler1D_type),
2108
2109 _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler2D_type),
2110 _textureSize(v130, glsl_type::ivec2_type, glsl_type::isampler2D_type),
2111 _textureSize(v130, glsl_type::ivec2_type, glsl_type::usampler2D_type),
2112
2113 _textureSize(v130, glsl_type::ivec3_type, glsl_type::sampler3D_type),
2114 _textureSize(v130, glsl_type::ivec3_type, glsl_type::isampler3D_type),
2115 _textureSize(v130, glsl_type::ivec3_type, glsl_type::usampler3D_type),
2116
2117 _textureSize(v130, glsl_type::ivec2_type, glsl_type::samplerCube_type),
2118 _textureSize(v130, glsl_type::ivec2_type, glsl_type::isamplerCube_type),
2119 _textureSize(v130, glsl_type::ivec2_type, glsl_type::usamplerCube_type),
2120
2121 _textureSize(v130, glsl_type::int_type, glsl_type::sampler1DShadow_type),
2122 _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler2DShadow_type),
2123 _textureSize(v130, glsl_type::ivec2_type, glsl_type::samplerCubeShadow_type),
2124
2125 _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler1DArray_type),
2126 _textureSize(v130, glsl_type::ivec2_type, glsl_type::isampler1DArray_type),
2127 _textureSize(v130, glsl_type::ivec2_type, glsl_type::usampler1DArray_type),
2128 _textureSize(v130, glsl_type::ivec3_type, glsl_type::sampler2DArray_type),
2129 _textureSize(v130, glsl_type::ivec3_type, glsl_type::isampler2DArray_type),
2130 _textureSize(v130, glsl_type::ivec3_type, glsl_type::usampler2DArray_type),
2131
2132 _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler1DArrayShadow_type),
2133 _textureSize(v130, glsl_type::ivec3_type, glsl_type::sampler2DArrayShadow_type),
2134
2135 _textureSize(texture_cube_map_array, glsl_type::ivec3_type, glsl_type::samplerCubeArray_type),
2136 _textureSize(texture_cube_map_array, glsl_type::ivec3_type, glsl_type::isamplerCubeArray_type),
2137 _textureSize(texture_cube_map_array, glsl_type::ivec3_type, glsl_type::usamplerCubeArray_type),
2138 _textureSize(texture_cube_map_array, glsl_type::ivec3_type, glsl_type::samplerCubeArrayShadow_type),
2139
2140 _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler2DRect_type),
2141 _textureSize(v130, glsl_type::ivec2_type, glsl_type::isampler2DRect_type),
2142 _textureSize(v130, glsl_type::ivec2_type, glsl_type::usampler2DRect_type),
2143 _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler2DRectShadow_type),
2144
2145 _textureSize(texture_buffer, glsl_type::int_type, glsl_type::samplerBuffer_type),
2146 _textureSize(texture_buffer, glsl_type::int_type, glsl_type::isamplerBuffer_type),
2147 _textureSize(texture_buffer, glsl_type::int_type, glsl_type::usamplerBuffer_type),
2148 _textureSize(texture_multisample, glsl_type::ivec2_type, glsl_type::sampler2DMS_type),
2149 _textureSize(texture_multisample, glsl_type::ivec2_type, glsl_type::isampler2DMS_type),
2150 _textureSize(texture_multisample, glsl_type::ivec2_type, glsl_type::usampler2DMS_type),
2151
2152 _textureSize(texture_multisample_array, glsl_type::ivec3_type, glsl_type::sampler2DMSArray_type),
2153 _textureSize(texture_multisample_array, glsl_type::ivec3_type, glsl_type::isampler2DMSArray_type),
2154 _textureSize(texture_multisample_array, glsl_type::ivec3_type, glsl_type::usampler2DMSArray_type),
2155
2156 _textureSize(texture_external_es3, glsl_type::ivec2_type, glsl_type::samplerExternalOES_type),
2157 NULL);
2158
2159 add_function("textureSize1D",
2160 _textureSize(gpu_shader4, glsl_type::int_type, glsl_type::sampler1D_type),
2161 _textureSize(gpu_shader4_integer, glsl_type::int_type, glsl_type::isampler1D_type),
2162 _textureSize(gpu_shader4_integer, glsl_type::int_type, glsl_type::usampler1D_type),
2163 NULL);
2164
2165 add_function("textureSize2D",
2166 _textureSize(gpu_shader4, glsl_type::ivec2_type, glsl_type::sampler2D_type),
2167 _textureSize(gpu_shader4_integer, glsl_type::ivec2_type, glsl_type::isampler2D_type),
2168 _textureSize(gpu_shader4_integer, glsl_type::ivec2_type, glsl_type::usampler2D_type),
2169 NULL);
2170
2171 add_function("textureSize3D",
2172 _textureSize(gpu_shader4, glsl_type::ivec3_type, glsl_type::sampler3D_type),
2173 _textureSize(gpu_shader4_integer, glsl_type::ivec3_type, glsl_type::isampler3D_type),
2174 _textureSize(gpu_shader4_integer, glsl_type::ivec3_type, glsl_type::usampler3D_type),
2175 NULL);
2176
2177 add_function("textureSizeCube",
2178 _textureSize(gpu_shader4, glsl_type::ivec2_type, glsl_type::samplerCube_type),
2179 _textureSize(gpu_shader4_integer, glsl_type::ivec2_type, glsl_type::isamplerCube_type),
2180 _textureSize(gpu_shader4_integer, glsl_type::ivec2_type, glsl_type::usamplerCube_type),
2181 NULL);
2182
2183 add_function("textureSize1DArray",
2184 _textureSize(gpu_shader4_array, glsl_type::ivec2_type, glsl_type::sampler1DArray_type),
2185 _textureSize(gpu_shader4_array_integer, glsl_type::ivec2_type, glsl_type::isampler1DArray_type),
2186 _textureSize(gpu_shader4_array_integer, glsl_type::ivec2_type, glsl_type::usampler1DArray_type),
2187 NULL);
2188
2189 add_function("textureSize2DArray",
2190 _textureSize(gpu_shader4_array, glsl_type::ivec3_type, glsl_type::sampler2DArray_type),
2191 _textureSize(gpu_shader4_array_integer, glsl_type::ivec3_type, glsl_type::isampler2DArray_type),
2192 _textureSize(gpu_shader4_array_integer, glsl_type::ivec3_type, glsl_type::usampler2DArray_type),
2193 NULL);
2194
2195 add_function("textureSize2DRect",
2196 _textureSize(gpu_shader4_rect, glsl_type::ivec2_type, glsl_type::sampler2DRect_type),
2197 _textureSize(gpu_shader4_rect_integer, glsl_type::ivec2_type, glsl_type::isampler2DRect_type),
2198 _textureSize(gpu_shader4_rect_integer, glsl_type::ivec2_type, glsl_type::usampler2DRect_type),
2199 NULL);
2200
2201 add_function("textureSizeBuffer",
2202 _textureSize(gpu_shader4_tbo, glsl_type::int_type, glsl_type::samplerBuffer_type),
2203 _textureSize(gpu_shader4_tbo_integer, glsl_type::int_type, glsl_type::isamplerBuffer_type),
2204 _textureSize(gpu_shader4_tbo_integer, glsl_type::int_type, glsl_type::usamplerBuffer_type),
2205 NULL);
2206
2207 add_function("textureSamples",
2208 _textureSamples(shader_samples, glsl_type::sampler2DMS_type),
2209 _textureSamples(shader_samples, glsl_type::isampler2DMS_type),
2210 _textureSamples(shader_samples, glsl_type::usampler2DMS_type),
2211
2212 _textureSamples(shader_samples, glsl_type::sampler2DMSArray_type),
2213 _textureSamples(shader_samples, glsl_type::isampler2DMSArray_type),
2214 _textureSamples(shader_samples, glsl_type::usampler2DMSArray_type),
2215 NULL);
2216
2217 add_function("texture",
2218 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
2219 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type),
2220 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type),
2221
2222 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
2223 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type),
2224 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type),
2225
2226 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
2227 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type),
2228 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type),
2229
2230 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
2231 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type),
2232 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type),
2233
2234 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
2235 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
2236 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::samplerCubeShadow_type, glsl_type::vec4_type),
2237
2238 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type),
2239 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type),
2240 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type),
2241
2242 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
2243 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type),
2244 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type),
2245
2246 _texture(ir_tex, texture_cube_map_array, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type),
2247 _texture(ir_tex, texture_cube_map_array, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type),
2248 _texture(ir_tex, texture_cube_map_array, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type),
2249
2250 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type),
2251 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type),
2252 /* samplerCubeArrayShadow is special; it has an extra parameter
2253 * for the shadow comparator since there is no vec5 type.
2254 */
2255 _textureCubeArrayShadow(ir_tex, texture_cube_map_array, glsl_type::samplerCubeArrayShadow_type),
2256
2257 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type),
2258 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type),
2259 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type),
2260
2261 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type),
2262
2263 _texture(ir_tex, texture_external_es3, glsl_type::vec4_type, glsl_type::samplerExternalOES_type, glsl_type::vec2_type),
2264
2265 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
2266 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type),
2267 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type),
2268
2269 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
2270 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type),
2271 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type),
2272
2273 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
2274 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type),
2275 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type),
2276
2277 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
2278 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type),
2279 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type),
2280
2281 _texture(ir_txb, v130_derivatives_only, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
2282 _texture(ir_txb, v130_derivatives_only, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
2283 _texture(ir_txb, v130_derivatives_only, glsl_type::float_type, glsl_type::samplerCubeShadow_type, glsl_type::vec4_type),
2284
2285 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type),
2286 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type),
2287 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type),
2288
2289 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
2290 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type),
2291 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type),
2292
2293 _texture(ir_txb, derivatives_texture_cube_map_array, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type),
2294 _texture(ir_txb, derivatives_texture_cube_map_array, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type),
2295 _texture(ir_txb, derivatives_texture_cube_map_array, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type),
2296
2297 _texture(ir_txb, v130_derivatives_only, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type),
2298 _texture(ir_tex, v130_or_gpu_shader4_and_tex_shadow_lod, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type),
2299 _texture(ir_txb, v130_or_gpu_shader4_and_tex_shadow_lod, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type),
2300
2301 _textureCubeArrayShadow(ir_tex, v130_or_gpu_shader4_and_tex_cube_map_array, glsl_type::samplerCubeArrayShadow_type),
2302 _textureCubeArrayShadow(ir_txb, v130_or_gpu_shader4_and_tex_cube_map_array, glsl_type::samplerCubeArrayShadow_type),
2303 NULL);
2304
2305 add_function("textureLod",
2306 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
2307 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type),
2308 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type),
2309
2310 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
2311 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type),
2312 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type),
2313
2314 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
2315 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type),
2316 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type),
2317
2318 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
2319 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type),
2320 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type),
2321
2322 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
2323 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
2324
2325 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type),
2326 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type),
2327 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type),
2328
2329 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
2330 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type),
2331 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type),
2332
2333 _texture(ir_txl, texture_cube_map_array, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type),
2334 _texture(ir_txl, texture_cube_map_array, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type),
2335 _texture(ir_txl, texture_cube_map_array, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type),
2336
2337 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type),
2338 _texture(ir_txl, v130_or_gpu_shader4_and_tex_shadow_lod, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type),
2339 _texture(ir_txl, v130_or_gpu_shader4_and_tex_shadow_lod, glsl_type::float_type, glsl_type::samplerCubeShadow_type, glsl_type::vec4_type),
2340 _textureCubeArrayShadow(ir_txl, v130_or_gpu_shader4_and_tex_cube_map_array, glsl_type::samplerCubeArrayShadow_type),
2341 NULL);
2342
2343 add_function("textureOffset",
2344 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET),
2345 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET),
2346 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET),
2347
2348 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2349 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2350 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2351
2352 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2353 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2354 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2355
2356 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
2357 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
2358 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
2359
2360 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2361
2362 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2363 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2364
2365 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2366 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2367 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2368
2369 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2370 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2371 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2372
2373 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2374 /* The next one was forgotten in GLSL 1.30 spec. It's from
2375 * EXT_gpu_shader4 originally. It was added in 4.30 with the
2376 * wrong syntax. This was corrected in 4.40. 4.30 indicates
2377 * that it was intended to be included previously, so allow it
2378 * in 1.30.
2379 */
2380 _texture(ir_tex, v130_desktop, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type, TEX_OFFSET),
2381
2382 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET),
2383 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET),
2384 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET),
2385
2386 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2387 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2388 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2389
2390 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2391 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2392 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2393
2394 _texture(ir_txb, v130_derivatives_only, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2395 _texture(ir_txb, v130_derivatives_only, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2396
2397 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2398 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2399 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2400
2401 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2402 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2403 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2404
2405 _texture(ir_txb, v130_derivatives_only, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2406 _texture(ir_tex, v130_or_gpu_shader4_and_tex_shadow_lod, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type, TEX_OFFSET),
2407 _texture(ir_txb, v130_or_gpu_shader4_and_tex_shadow_lod, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type, TEX_OFFSET),
2408 NULL);
2409
2410 add_function("texture1DOffset",
2411 _texture(ir_tex, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET),
2412 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET),
2413 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET),
2414 _texture(ir_txb, gpu_shader4_derivs_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET),
2415 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET),
2416 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET),
2417 NULL);
2418
2419 add_function("texture2DOffset",
2420 _texture(ir_tex, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2421 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2422 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2423 _texture(ir_txb, gpu_shader4_derivs_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2424 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2425 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2426 NULL);
2427
2428 add_function("texture3DOffset",
2429 _texture(ir_tex, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2430 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2431 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2432 _texture(ir_txb, gpu_shader4_derivs_only, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2433 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2434 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2435 NULL);
2436
2437 add_function("texture2DRectOffset",
2438 _texture(ir_tex, gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
2439 _texture(ir_tex, gpu_shader4_rect_integer, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
2440 _texture(ir_tex, gpu_shader4_rect_integer, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
2441 NULL);
2442
2443 add_function("shadow2DRectOffset",
2444 _texture(ir_tex, gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2445 NULL);
2446
2447 add_function("shadow1DOffset",
2448 _texture(ir_tex, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2449 _texture(ir_txb, gpu_shader4_derivs_only, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2450 NULL);
2451
2452 add_function("shadow2DOffset",
2453 _texture(ir_tex, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2454 _texture(ir_txb, gpu_shader4_derivs_only, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2455 NULL);
2456
2457 add_function("texture1DArrayOffset",
2458 _texture(ir_tex, gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2459 _texture(ir_tex, gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2460 _texture(ir_tex, gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2461 _texture(ir_txb, gpu_shader4_array_derivs_only, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2462 _texture(ir_txb, gpu_shader4_array_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2463 _texture(ir_txb, gpu_shader4_array_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2464 NULL);
2465
2466 add_function("texture2DArrayOffset",
2467 _texture(ir_tex, gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2468 _texture(ir_tex, gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2469 _texture(ir_tex, gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2470 _texture(ir_txb, gpu_shader4_array_derivs_only, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2471 _texture(ir_txb, gpu_shader4_array_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2472 _texture(ir_txb, gpu_shader4_array_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2473 NULL);
2474
2475 add_function("shadow1DArrayOffset",
2476 _texture(ir_tex, gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2477 _texture(ir_txb, gpu_shader4_array_derivs_only, glsl_type::vec4_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2478 NULL);
2479
2480 add_function("shadow2DArrayOffset",
2481 _texture(ir_tex, gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type, TEX_OFFSET),
2482 NULL);
2483
2484 add_function("textureProj",
2485 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
2486 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
2487 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
2488 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
2489 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
2490 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
2491
2492 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
2493 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
2494 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
2495 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
2496 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
2497 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
2498
2499 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
2500 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
2501 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
2502
2503 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
2504 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
2505
2506 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
2507 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
2508 _texture(ir_tex, texture_external_es3, glsl_type::vec4_type, glsl_type::samplerExternalOES_type, glsl_type::vec3_type, TEX_PROJECT),
2509 _texture(ir_tex, texture_external_es3, glsl_type::vec4_type, glsl_type::samplerExternalOES_type, glsl_type::vec4_type, TEX_PROJECT),
2510
2511 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
2512 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
2513 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
2514 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
2515
2516 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT),
2517
2518 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
2519 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
2520 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
2521 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
2522 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
2523 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
2524
2525 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
2526 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
2527 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
2528 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
2529 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
2530 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
2531
2532 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
2533 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
2534 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
2535
2536 _texture(ir_txb, v130_derivatives_only, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
2537 _texture(ir_txb, v130_derivatives_only, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
2538 NULL);
2539
2540 add_function("texelFetch",
2541 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::int_type),
2542 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::int_type),
2543 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::int_type),
2544
2545 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::ivec2_type),
2546 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::ivec2_type),
2547 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::ivec2_type),
2548
2549 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::ivec3_type),
2550 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::ivec3_type),
2551 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::ivec3_type),
2552
2553 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::ivec2_type),
2554 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::ivec2_type),
2555 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::ivec2_type),
2556
2557 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::ivec2_type),
2558 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::ivec2_type),
2559 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::ivec2_type),
2560
2561 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::ivec3_type),
2562 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::ivec3_type),
2563 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::ivec3_type),
2564
2565 _texelFetch(texture_buffer, glsl_type::vec4_type, glsl_type::samplerBuffer_type, glsl_type::int_type),
2566 _texelFetch(texture_buffer, glsl_type::ivec4_type, glsl_type::isamplerBuffer_type, glsl_type::int_type),
2567 _texelFetch(texture_buffer, glsl_type::uvec4_type, glsl_type::usamplerBuffer_type, glsl_type::int_type),
2568
2569 _texelFetch(texture_multisample, glsl_type::vec4_type, glsl_type::sampler2DMS_type, glsl_type::ivec2_type),
2570 _texelFetch(texture_multisample, glsl_type::ivec4_type, glsl_type::isampler2DMS_type, glsl_type::ivec2_type),
2571 _texelFetch(texture_multisample, glsl_type::uvec4_type, glsl_type::usampler2DMS_type, glsl_type::ivec2_type),
2572
2573 _texelFetch(texture_multisample_array, glsl_type::vec4_type, glsl_type::sampler2DMSArray_type, glsl_type::ivec3_type),
2574 _texelFetch(texture_multisample_array, glsl_type::ivec4_type, glsl_type::isampler2DMSArray_type, glsl_type::ivec3_type),
2575 _texelFetch(texture_multisample_array, glsl_type::uvec4_type, glsl_type::usampler2DMSArray_type, glsl_type::ivec3_type),
2576
2577 _texelFetch(texture_external_es3, glsl_type::vec4_type, glsl_type::samplerExternalOES_type, glsl_type::ivec2_type),
2578
2579 NULL);
2580
2581 add_function("texelFetch1D",
2582 _texelFetch(gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::int_type),
2583 _texelFetch(gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::int_type),
2584 _texelFetch(gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::int_type),
2585 NULL);
2586
2587 add_function("texelFetch2D",
2588 _texelFetch(gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::ivec2_type),
2589 _texelFetch(gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::ivec2_type),
2590 _texelFetch(gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::ivec2_type),
2591 NULL);
2592
2593 add_function("texelFetch3D",
2594 _texelFetch(gpu_shader4, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::ivec3_type),
2595 _texelFetch(gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::ivec3_type),
2596 _texelFetch(gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::ivec3_type),
2597 NULL);
2598
2599 add_function("texelFetch2DRect",
2600 _texelFetch(gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::ivec2_type),
2601 _texelFetch(gpu_shader4_rect_integer, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::ivec2_type),
2602 _texelFetch(gpu_shader4_rect_integer, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::ivec2_type),
2603 NULL);
2604
2605 add_function("texelFetch1DArray",
2606 _texelFetch(gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::ivec2_type),
2607 _texelFetch(gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::ivec2_type),
2608 _texelFetch(gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::ivec2_type),
2609 NULL);
2610
2611 add_function("texelFetch2DArray",
2612 _texelFetch(gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::ivec3_type),
2613 _texelFetch(gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::ivec3_type),
2614 _texelFetch(gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::ivec3_type),
2615 NULL);
2616
2617 add_function("texelFetchBuffer",
2618 _texelFetch(gpu_shader4_tbo, glsl_type::vec4_type, glsl_type::samplerBuffer_type, glsl_type::int_type),
2619 _texelFetch(gpu_shader4_tbo_integer, glsl_type::ivec4_type, glsl_type::isamplerBuffer_type, glsl_type::int_type),
2620 _texelFetch(gpu_shader4_tbo_integer, glsl_type::uvec4_type, glsl_type::usamplerBuffer_type, glsl_type::int_type),
2621 NULL);
2622
2623 add_function("texelFetchOffset",
2624 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::int_type, glsl_type::int_type),
2625 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::int_type, glsl_type::int_type),
2626 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::int_type, glsl_type::int_type),
2627
2628 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
2629 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
2630 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
2631
2632 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::ivec3_type, glsl_type::ivec3_type),
2633 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::ivec3_type, glsl_type::ivec3_type),
2634 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::ivec3_type, glsl_type::ivec3_type),
2635
2636 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
2637 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
2638 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
2639
2640 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::ivec2_type, glsl_type::int_type),
2641 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::ivec2_type, glsl_type::int_type),
2642 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::ivec2_type, glsl_type::int_type),
2643
2644 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::ivec3_type, glsl_type::ivec2_type),
2645 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::ivec3_type, glsl_type::ivec2_type),
2646 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::ivec3_type, glsl_type::ivec2_type),
2647
2648 NULL);
2649
2650 add_function("texelFetch1DOffset",
2651 _texelFetch(gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::int_type, glsl_type::int_type),
2652 _texelFetch(gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::int_type, glsl_type::int_type),
2653 _texelFetch(gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::int_type, glsl_type::int_type),
2654 NULL);
2655
2656 add_function("texelFetch2DOffset",
2657 _texelFetch(gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
2658 _texelFetch(gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
2659 _texelFetch(gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
2660 NULL);
2661
2662 add_function("texelFetch3DOffset",
2663 _texelFetch(gpu_shader4, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::ivec3_type, glsl_type::ivec3_type),
2664 _texelFetch(gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::ivec3_type, glsl_type::ivec3_type),
2665 _texelFetch(gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::ivec3_type, glsl_type::ivec3_type),
2666 NULL);
2667
2668 add_function("texelFetch2DRectOffset",
2669 _texelFetch(gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
2670 _texelFetch(gpu_shader4_rect_integer, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
2671 _texelFetch(gpu_shader4_rect_integer, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
2672 NULL);
2673
2674 add_function("texelFetch1DArrayOffset",
2675 _texelFetch(gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::ivec2_type, glsl_type::int_type),
2676 _texelFetch(gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::ivec2_type, glsl_type::int_type),
2677 _texelFetch(gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::ivec2_type, glsl_type::int_type),
2678 NULL);
2679
2680 add_function("texelFetch2DArrayOffset",
2681 _texelFetch(gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::ivec3_type, glsl_type::ivec2_type),
2682 _texelFetch(gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::ivec3_type, glsl_type::ivec2_type),
2683 _texelFetch(gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::ivec3_type, glsl_type::ivec2_type),
2684 NULL);
2685
2686 add_function("textureProjOffset",
2687 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2688 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2689 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2690 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2691 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2692 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2693
2694 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2695 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2696 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2697 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2698 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2699 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2700
2701 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2702 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2703 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2704
2705 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2706 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2707
2708 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2709 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2710 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2711 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2712 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2713 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2714
2715 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2716
2717 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2718 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2719 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2720 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2721 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2722 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2723
2724 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2725 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2726 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2727 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2728 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2729 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2730
2731 _texture(ir_txb, v130_derivatives_only, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2732 _texture(ir_txb, v130_derivatives_only, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2733 _texture(ir_txb, v130_derivatives_only, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2734
2735 _texture(ir_txb, v130_derivatives_only, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2736 _texture(ir_txb, v130_derivatives_only, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2737 NULL);
2738
2739 add_function("texture1DProjOffset",
2740 _texture(ir_tex, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2741 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2742 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2743 _texture(ir_tex, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2744 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2745 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2746 _texture(ir_txb, gpu_shader4_derivs_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2747 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2748 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2749 _texture(ir_txb, gpu_shader4_derivs_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2750 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2751 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2752 NULL);
2753
2754 add_function("texture2DProjOffset",
2755 _texture(ir_tex, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2756 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2757 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2758 _texture(ir_tex, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2759 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2760 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2761 _texture(ir_txb, gpu_shader4_derivs_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2762 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2763 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2764 _texture(ir_txb, gpu_shader4_derivs_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2765 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2766 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2767 NULL);
2768
2769 add_function("texture3DProjOffset",
2770 _texture(ir_tex, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2771 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2772 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2773 _texture(ir_txb, gpu_shader4_derivs_only, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2774 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2775 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2776 NULL);
2777
2778 add_function("shadow1DProjOffset",
2779 _texture(ir_tex, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2780 _texture(ir_txb, gpu_shader4_derivs_only, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2781 NULL);
2782
2783 add_function("shadow2DProjOffset",
2784 _texture(ir_tex, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2785 _texture(ir_txb, gpu_shader4_derivs_only, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2786 NULL);
2787
2788 add_function("texture2DRectProjOffset",
2789 _texture(ir_tex, gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2790 _texture(ir_tex, gpu_shader4_rect_integer, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2791 _texture(ir_tex, gpu_shader4_rect_integer, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2792 _texture(ir_tex, gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2793 _texture(ir_tex, gpu_shader4_rect_integer, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2794 _texture(ir_tex, gpu_shader4_rect_integer, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2795 NULL);
2796
2797 add_function("shadow2DRectProjOffset",
2798 _texture(ir_tex, gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2799 NULL);
2800
2801 add_function("textureLodOffset",
2802 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET),
2803 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET),
2804 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET),
2805
2806 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2807 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2808 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2809
2810 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2811 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2812 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2813
2814 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2815 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2816
2817 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2818 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2819 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2820
2821 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2822 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2823 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2824
2825 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2826 _texture(ir_txl, v130_or_gpu_shader4_and_tex_shadow_lod, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type, TEX_OFFSET),
2827 NULL);
2828
2829 add_function("texture1DLodOffset",
2830 _texture(ir_txl, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET),
2831 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET),
2832 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET),
2833 NULL);
2834
2835 add_function("texture2DLodOffset",
2836 _texture(ir_txl, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2837 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2838 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2839 NULL);
2840
2841 add_function("texture3DLodOffset",
2842 _texture(ir_txl, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2843 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2844 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
2845 NULL);
2846
2847 add_function("shadow1DLodOffset",
2848 _texture(ir_txl, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2849 NULL);
2850
2851 add_function("shadow2DLodOffset",
2852 _texture(ir_txl, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2853 NULL);
2854
2855 add_function("texture1DArrayLodOffset",
2856 _texture(ir_txl, gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2857 _texture(ir_txl, gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2858 _texture(ir_txl, gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
2859 NULL);
2860
2861 add_function("texture2DArrayLodOffset",
2862 _texture(ir_txl, gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2863 _texture(ir_txl, gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2864 _texture(ir_txl, gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
2865 NULL);
2866
2867 add_function("shadow1DArrayLodOffset",
2868 _texture(ir_txl, gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET),
2869 NULL);
2870
2871 add_function("textureProjLod",
2872 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
2873 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
2874 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
2875 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
2876 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
2877 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
2878
2879 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
2880 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
2881 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
2882 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
2883 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
2884 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
2885
2886 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
2887 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
2888 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
2889
2890 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
2891 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
2892 NULL);
2893
2894 add_function("textureProjLodOffset",
2895 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2896 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2897 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2898 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2899 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2900 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2901
2902 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2903 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2904 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2905 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2906 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2907 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2908
2909 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2910 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2911 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2912
2913 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2914 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2915 NULL);
2916
2917 add_function("texture1DProjLodOffset",
2918 _texture(ir_txl, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2919 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2920 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
2921 _texture(ir_txl, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2922 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2923 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2924 NULL);
2925
2926 add_function("texture2DProjLodOffset",
2927 _texture(ir_txl, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2928 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2929 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
2930 _texture(ir_txl, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2931 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2932 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2933 NULL);
2934
2935 add_function("texture3DProjLodOffset",
2936 _texture(ir_txl, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2937 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2938 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2939 NULL);
2940
2941 add_function("shadow1DProjLodOffset",
2942 _texture(ir_txl, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2943 NULL);
2944
2945 add_function("shadow2DProjLodOffset",
2946 _texture(ir_txl, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
2947 NULL);
2948
2949 add_function("textureGrad",
2950 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
2951 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type),
2952 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type),
2953
2954 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
2955 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type),
2956 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type),
2957
2958 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
2959 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type),
2960 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type),
2961
2962 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
2963 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type),
2964 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type),
2965
2966 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type),
2967 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type),
2968 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type),
2969
2970 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type),
2971
2972 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
2973 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
2974 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::samplerCubeShadow_type, glsl_type::vec4_type),
2975
2976 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type),
2977 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type),
2978 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type),
2979
2980 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
2981 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type),
2982 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type),
2983
2984 _texture(ir_txd, texture_cube_map_array, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type),
2985 _texture(ir_txd, texture_cube_map_array, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type),
2986 _texture(ir_txd, texture_cube_map_array, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type),
2987
2988 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type),
2989 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type),
2990 NULL);
2991
2992 add_function("textureGradOffset",
2993 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET),
2994 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET),
2995 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET),
2996
2997 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2998 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
2999 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
3000
3001 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
3002 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
3003 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
3004
3005 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
3006 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
3007 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
3008
3009 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type, TEX_OFFSET),
3010
3011 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
3012 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
3013
3014 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
3015 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
3016 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
3017
3018 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
3019 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
3020 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
3021
3022 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET),
3023 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type, TEX_OFFSET),
3024 NULL);
3025
3026 add_function("texture1DGradOffset",
3027 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET),
3028 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET),
3029 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET),
3030 NULL);
3031
3032 add_function("texture2DGradOffset",
3033 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
3034 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
3035 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
3036 NULL);
3037
3038 add_function("texture3DGradOffset",
3039 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
3040 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
3041 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
3042 NULL);
3043
3044 add_function("texture2DRectGradOffset",
3045 _texture(ir_txd, gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
3046 _texture(ir_txd, gpu_shader4_rect_integer, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
3047 _texture(ir_txd, gpu_shader4_rect_integer, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
3048 NULL);
3049
3050 add_function("shadow2DRectGradOffset",
3051 _texture(ir_txd, gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type, TEX_OFFSET),
3052 NULL);
3053
3054 add_function("shadow1DGradOffset",
3055 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
3056 NULL);
3057
3058 add_function("shadow2DGradOffset",
3059 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
3060 NULL);
3061
3062 add_function("texture1DArrayGradOffset",
3063 _texture(ir_txd, gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
3064 _texture(ir_txd, gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
3065 _texture(ir_txd, gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
3066 NULL);
3067
3068 add_function("texture2DArrayGradOffset",
3069 _texture(ir_txd, gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
3070 _texture(ir_txd, gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
3071 _texture(ir_txd, gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
3072 NULL);
3073
3074 add_function("shadow1DArrayGradOffset",
3075 _texture(ir_txd, gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET),
3076 NULL);
3077
3078 add_function("shadow2DArrayGradOffset",
3079 _texture(ir_txd, gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type, TEX_OFFSET),
3080 NULL);
3081
3082 add_function("textureProjGrad",
3083 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3084 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3085 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3086 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3087 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3088 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3089
3090 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3091 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3092 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3093 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3094 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3095 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3096
3097 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3098 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3099 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3100
3101 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
3102 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
3103 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
3104 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
3105 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
3106 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
3107
3108 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3109
3110 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3111 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3112 NULL);
3113
3114 add_function("textureProjGradOffset",
3115 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
3116 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
3117 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
3118 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3119 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3120 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3121
3122 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
3123 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
3124 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
3125 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3126 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3127 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3128
3129 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3130 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3131 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3132
3133 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
3134 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
3135 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
3136 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3137 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3138 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3139
3140 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3141
3142 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3143 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3144 NULL);
3145
3146 add_function("texture1DProjGradOffset",
3147 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
3148 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
3149 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
3150 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3151 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3152 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3153 NULL);
3154
3155 add_function("texture2DProjGradOffset",
3156 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
3157 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
3158 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
3159 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3160 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3161 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3162 NULL);
3163
3164 add_function("texture3DProjGradOffset",
3165 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3166 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3167 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3168 NULL);
3169
3170 add_function("texture2DRectProjGradOffset",
3171 _texture(ir_txd, gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
3172 _texture(ir_txd, gpu_shader4_rect_integer, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
3173 _texture(ir_txd, gpu_shader4_rect_integer, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
3174 _texture(ir_txd, gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3175 _texture(ir_txd, gpu_shader4_rect_integer, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3176 _texture(ir_txd, gpu_shader4_rect_integer, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3177 NULL);
3178
3179 add_function("shadow2DRectProjGradOffset",
3180 _texture(ir_txd, gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3181 NULL);
3182
3183 add_function("shadow1DProjGradOffset",
3184 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3185 NULL);
3186
3187 add_function("shadow2DProjGradOffset",
3188 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
3189 NULL);
3190
3191 add_function("EmitVertex", _EmitVertex(), NULL);
3192 add_function("EndPrimitive", _EndPrimitive(), NULL);
3193 add_function("EmitStreamVertex",
3194 _EmitStreamVertex(gs_streams, glsl_type::uint_type),
3195 _EmitStreamVertex(gs_streams, glsl_type::int_type),
3196 NULL);
3197 add_function("EndStreamPrimitive",
3198 _EndStreamPrimitive(gs_streams, glsl_type::uint_type),
3199 _EndStreamPrimitive(gs_streams, glsl_type::int_type),
3200 NULL);
3201 add_function("barrier", _barrier(), NULL);
3202
3203 add_function("textureQueryLOD",
3204 _textureQueryLod(texture_query_lod, glsl_type::sampler1D_type, glsl_type::float_type),
3205 _textureQueryLod(texture_query_lod, glsl_type::isampler1D_type, glsl_type::float_type),
3206 _textureQueryLod(texture_query_lod, glsl_type::usampler1D_type, glsl_type::float_type),
3207
3208 _textureQueryLod(texture_query_lod, glsl_type::sampler2D_type, glsl_type::vec2_type),
3209 _textureQueryLod(texture_query_lod, glsl_type::isampler2D_type, glsl_type::vec2_type),
3210 _textureQueryLod(texture_query_lod, glsl_type::usampler2D_type, glsl_type::vec2_type),
3211
3212 _textureQueryLod(texture_query_lod, glsl_type::sampler3D_type, glsl_type::vec3_type),
3213 _textureQueryLod(texture_query_lod, glsl_type::isampler3D_type, glsl_type::vec3_type),
3214 _textureQueryLod(texture_query_lod, glsl_type::usampler3D_type, glsl_type::vec3_type),
3215
3216 _textureQueryLod(texture_query_lod, glsl_type::samplerCube_type, glsl_type::vec3_type),
3217 _textureQueryLod(texture_query_lod, glsl_type::isamplerCube_type, glsl_type::vec3_type),
3218 _textureQueryLod(texture_query_lod, glsl_type::usamplerCube_type, glsl_type::vec3_type),
3219
3220 _textureQueryLod(texture_query_lod, glsl_type::sampler1DArray_type, glsl_type::float_type),
3221 _textureQueryLod(texture_query_lod, glsl_type::isampler1DArray_type, glsl_type::float_type),
3222 _textureQueryLod(texture_query_lod, glsl_type::usampler1DArray_type, glsl_type::float_type),
3223
3224 _textureQueryLod(texture_query_lod, glsl_type::sampler2DArray_type, glsl_type::vec2_type),
3225 _textureQueryLod(texture_query_lod, glsl_type::isampler2DArray_type, glsl_type::vec2_type),
3226 _textureQueryLod(texture_query_lod, glsl_type::usampler2DArray_type, glsl_type::vec2_type),
3227
3228 _textureQueryLod(texture_query_lod, glsl_type::samplerCubeArray_type, glsl_type::vec3_type),
3229 _textureQueryLod(texture_query_lod, glsl_type::isamplerCubeArray_type, glsl_type::vec3_type),
3230 _textureQueryLod(texture_query_lod, glsl_type::usamplerCubeArray_type, glsl_type::vec3_type),
3231
3232 _textureQueryLod(texture_query_lod, glsl_type::sampler1DShadow_type, glsl_type::float_type),
3233 _textureQueryLod(texture_query_lod, glsl_type::sampler2DShadow_type, glsl_type::vec2_type),
3234 _textureQueryLod(texture_query_lod, glsl_type::samplerCubeShadow_type, glsl_type::vec3_type),
3235 _textureQueryLod(texture_query_lod, glsl_type::sampler1DArrayShadow_type, glsl_type::float_type),
3236 _textureQueryLod(texture_query_lod, glsl_type::sampler2DArrayShadow_type, glsl_type::vec2_type),
3237 _textureQueryLod(texture_query_lod, glsl_type::samplerCubeArrayShadow_type, glsl_type::vec3_type),
3238 NULL);
3239
3240 add_function("textureQueryLod",
3241 _textureQueryLod(v400_derivatives_only, glsl_type::sampler1D_type, glsl_type::float_type),
3242 _textureQueryLod(v400_derivatives_only, glsl_type::isampler1D_type, glsl_type::float_type),
3243 _textureQueryLod(v400_derivatives_only, glsl_type::usampler1D_type, glsl_type::float_type),
3244
3245 _textureQueryLod(v400_derivatives_only, glsl_type::sampler2D_type, glsl_type::vec2_type),
3246 _textureQueryLod(v400_derivatives_only, glsl_type::isampler2D_type, glsl_type::vec2_type),
3247 _textureQueryLod(v400_derivatives_only, glsl_type::usampler2D_type, glsl_type::vec2_type),
3248
3249 _textureQueryLod(v400_derivatives_only, glsl_type::sampler3D_type, glsl_type::vec3_type),
3250 _textureQueryLod(v400_derivatives_only, glsl_type::isampler3D_type, glsl_type::vec3_type),
3251 _textureQueryLod(v400_derivatives_only, glsl_type::usampler3D_type, glsl_type::vec3_type),
3252
3253 _textureQueryLod(v400_derivatives_only, glsl_type::samplerCube_type, glsl_type::vec3_type),
3254 _textureQueryLod(v400_derivatives_only, glsl_type::isamplerCube_type, glsl_type::vec3_type),
3255 _textureQueryLod(v400_derivatives_only, glsl_type::usamplerCube_type, glsl_type::vec3_type),
3256
3257 _textureQueryLod(v400_derivatives_only, glsl_type::sampler1DArray_type, glsl_type::float_type),
3258 _textureQueryLod(v400_derivatives_only, glsl_type::isampler1DArray_type, glsl_type::float_type),
3259 _textureQueryLod(v400_derivatives_only, glsl_type::usampler1DArray_type, glsl_type::float_type),
3260
3261 _textureQueryLod(v400_derivatives_only, glsl_type::sampler2DArray_type, glsl_type::vec2_type),
3262 _textureQueryLod(v400_derivatives_only, glsl_type::isampler2DArray_type, glsl_type::vec2_type),
3263 _textureQueryLod(v400_derivatives_only, glsl_type::usampler2DArray_type, glsl_type::vec2_type),
3264
3265 _textureQueryLod(v400_derivatives_only, glsl_type::samplerCubeArray_type, glsl_type::vec3_type),
3266 _textureQueryLod(v400_derivatives_only, glsl_type::isamplerCubeArray_type, glsl_type::vec3_type),
3267 _textureQueryLod(v400_derivatives_only, glsl_type::usamplerCubeArray_type, glsl_type::vec3_type),
3268
3269 _textureQueryLod(v400_derivatives_only, glsl_type::sampler1DShadow_type, glsl_type::float_type),
3270 _textureQueryLod(v400_derivatives_only, glsl_type::sampler2DShadow_type, glsl_type::vec2_type),
3271 _textureQueryLod(v400_derivatives_only, glsl_type::samplerCubeShadow_type, glsl_type::vec3_type),
3272 _textureQueryLod(v400_derivatives_only, glsl_type::sampler1DArrayShadow_type, glsl_type::float_type),
3273 _textureQueryLod(v400_derivatives_only, glsl_type::sampler2DArrayShadow_type, glsl_type::vec2_type),
3274 _textureQueryLod(v400_derivatives_only, glsl_type::samplerCubeArrayShadow_type, glsl_type::vec3_type),
3275 NULL);
3276
3277 add_function("textureQueryLevels",
3278 _textureQueryLevels(texture_query_levels, glsl_type::sampler1D_type),
3279 _textureQueryLevels(texture_query_levels, glsl_type::sampler2D_type),
3280 _textureQueryLevels(texture_query_levels, glsl_type::sampler3D_type),
3281 _textureQueryLevels(texture_query_levels, glsl_type::samplerCube_type),
3282 _textureQueryLevels(texture_query_levels, glsl_type::sampler1DArray_type),
3283 _textureQueryLevels(texture_query_levels, glsl_type::sampler2DArray_type),
3284 _textureQueryLevels(texture_query_levels, glsl_type::samplerCubeArray_type),
3285 _textureQueryLevels(texture_query_levels, glsl_type::sampler1DShadow_type),
3286 _textureQueryLevels(texture_query_levels, glsl_type::sampler2DShadow_type),
3287 _textureQueryLevels(texture_query_levels, glsl_type::samplerCubeShadow_type),
3288 _textureQueryLevels(texture_query_levels, glsl_type::sampler1DArrayShadow_type),
3289 _textureQueryLevels(texture_query_levels, glsl_type::sampler2DArrayShadow_type),
3290 _textureQueryLevels(texture_query_levels, glsl_type::samplerCubeArrayShadow_type),
3291
3292 _textureQueryLevels(texture_query_levels, glsl_type::isampler1D_type),
3293 _textureQueryLevels(texture_query_levels, glsl_type::isampler2D_type),
3294 _textureQueryLevels(texture_query_levels, glsl_type::isampler3D_type),
3295 _textureQueryLevels(texture_query_levels, glsl_type::isamplerCube_type),
3296 _textureQueryLevels(texture_query_levels, glsl_type::isampler1DArray_type),
3297 _textureQueryLevels(texture_query_levels, glsl_type::isampler2DArray_type),
3298 _textureQueryLevels(texture_query_levels, glsl_type::isamplerCubeArray_type),
3299
3300 _textureQueryLevels(texture_query_levels, glsl_type::usampler1D_type),
3301 _textureQueryLevels(texture_query_levels, glsl_type::usampler2D_type),
3302 _textureQueryLevels(texture_query_levels, glsl_type::usampler3D_type),
3303 _textureQueryLevels(texture_query_levels, glsl_type::usamplerCube_type),
3304 _textureQueryLevels(texture_query_levels, glsl_type::usampler1DArray_type),
3305 _textureQueryLevels(texture_query_levels, glsl_type::usampler2DArray_type),
3306 _textureQueryLevels(texture_query_levels, glsl_type::usamplerCubeArray_type),
3307
3308 NULL);
3309
3310 add_function("textureSamplesIdenticalEXT",
3311 _textureSamplesIdentical(texture_samples_identical, glsl_type::sampler2DMS_type, glsl_type::ivec2_type),
3312 _textureSamplesIdentical(texture_samples_identical, glsl_type::isampler2DMS_type, glsl_type::ivec2_type),
3313 _textureSamplesIdentical(texture_samples_identical, glsl_type::usampler2DMS_type, glsl_type::ivec2_type),
3314
3315 _textureSamplesIdentical(texture_samples_identical_array, glsl_type::sampler2DMSArray_type, glsl_type::ivec3_type),
3316 _textureSamplesIdentical(texture_samples_identical_array, glsl_type::isampler2DMSArray_type, glsl_type::ivec3_type),
3317 _textureSamplesIdentical(texture_samples_identical_array, glsl_type::usampler2DMSArray_type, glsl_type::ivec3_type),
3318 NULL);
3319
3320 add_function("texture1D",
3321 _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
3322 _texture(ir_txb, v110_derivatives_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
3323 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type),
3324 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type),
3325 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type),
3326 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type),
3327 NULL);
3328
3329 add_function("texture1DArray",
3330 _texture(ir_tex, texture_array, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type),
3331 _texture(ir_txb, texture_array_derivs_only,glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type),
3332 _texture(ir_tex, gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type),
3333 _texture(ir_txb, gpu_shader4_array_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type),
3334 _texture(ir_tex, gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type),
3335 _texture(ir_txb, gpu_shader4_array_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type),
3336 NULL);
3337
3338 add_function("texture1DProj",
3339 _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3340 _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3341 _texture(ir_txb, v110_derivatives_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3342 _texture(ir_txb, v110_derivatives_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3343 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3344 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3345 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3346 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3347 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3348 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3349 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3350 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3351 NULL);
3352
3353 add_function("texture1DLod",
3354 _texture(ir_txl, tex1d_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
3355 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type),
3356 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type),
3357 NULL);
3358
3359 add_function("texture1DArrayLod",
3360 _texture(ir_txl, texture_array_lod, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type),
3361 _texture(ir_txl, gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type),
3362 _texture(ir_txl, gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type),
3363 NULL);
3364
3365 add_function("texture1DProjLod",
3366 _texture(ir_txl, tex1d_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3367 _texture(ir_txl, tex1d_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3368 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3369 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3370 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3371 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3372 NULL);
3373
3374 add_function("texture2D",
3375 _texture(ir_tex, always_available, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
3376 _texture(ir_txb, derivatives_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
3377 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type),
3378 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type),
3379 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type),
3380 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type),
3381 _texture(ir_tex, texture_external, glsl_type::vec4_type, glsl_type::samplerExternalOES_type, glsl_type::vec2_type),
3382 NULL);
3383
3384 add_function("texture2DArray",
3385 _texture(ir_tex, texture_array, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
3386 _texture(ir_txb, texture_array_derivs_only, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
3387 _texture(ir_tex, gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type),
3388 _texture(ir_txb, gpu_shader4_array_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type),
3389 _texture(ir_tex, gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type),
3390 _texture(ir_txb, gpu_shader4_array_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type),
3391 NULL);
3392
3393 add_function("texture2DProj",
3394 _texture(ir_tex, always_available, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3395 _texture(ir_tex, always_available, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3396 _texture(ir_txb, derivatives_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3397 _texture(ir_txb, derivatives_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3398 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3399 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3400 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3401 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3402 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3403 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3404 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3405 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3406 _texture(ir_tex, texture_external, glsl_type::vec4_type, glsl_type::samplerExternalOES_type, glsl_type::vec3_type, TEX_PROJECT),
3407 _texture(ir_tex, texture_external, glsl_type::vec4_type, glsl_type::samplerExternalOES_type, glsl_type::vec4_type, TEX_PROJECT),
3408 NULL);
3409
3410 add_function("texture2DLod",
3411 _texture(ir_txl, lod_exists_in_stage, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
3412 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type),
3413 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type),
3414 NULL);
3415
3416 add_function("texture2DArrayLod",
3417 _texture(ir_txl, texture_array_lod, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
3418 _texture(ir_txl, gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type),
3419 _texture(ir_txl, gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type),
3420 NULL);
3421
3422 add_function("texture2DProjLod",
3423 _texture(ir_txl, lod_exists_in_stage, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3424 _texture(ir_txl, lod_exists_in_stage, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3425 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3426 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3427 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3428 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3429 NULL);
3430
3431 add_function("texture3D",
3432 _texture(ir_tex, tex3d, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
3433 _texture(ir_txb, derivatives_tex3d, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
3434 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type),
3435 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type),
3436 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type),
3437 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type),
3438 NULL);
3439
3440 add_function("texture3DProj",
3441 _texture(ir_tex, tex3d, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3442 _texture(ir_txb, derivatives_tex3d, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3443 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3444 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3445 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3446 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3447 NULL);
3448
3449 add_function("texture3DLod",
3450 _texture(ir_txl, tex3d_lod, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
3451 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type),
3452 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type),
3453 NULL);
3454
3455 add_function("texture3DProjLod",
3456 _texture(ir_txl, tex3d_lod, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3457 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3458 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3459 NULL);
3460
3461 add_function("textureCube",
3462 _texture(ir_tex, always_available, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
3463 _texture(ir_txb, derivatives_only, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
3464 _texture(ir_tex, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type),
3465 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type),
3466 _texture(ir_tex, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type),
3467 _texture(ir_txb, gpu_shader4_integer_derivs_only, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type),
3468 NULL);
3469
3470 add_function("textureCubeLod",
3471 _texture(ir_txl, lod_exists_in_stage, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
3472 _texture(ir_txl, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type),
3473 _texture(ir_txl, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type),
3474 NULL);
3475
3476 add_function("texture2DRect",
3477 _texture(ir_tex, texture_rectangle, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type),
3478 _texture(ir_tex, gpu_shader4_rect_integer, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type),
3479 _texture(ir_tex, gpu_shader4_rect_integer, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type),
3480 NULL);
3481
3482 add_function("texture2DRectProj",
3483 _texture(ir_tex, texture_rectangle, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
3484 _texture(ir_tex, texture_rectangle, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
3485 _texture(ir_tex, gpu_shader4_rect_integer, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
3486 _texture(ir_tex, gpu_shader4_rect_integer, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
3487 _texture(ir_tex, gpu_shader4_rect_integer, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
3488 _texture(ir_tex, gpu_shader4_rect_integer, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
3489 NULL);
3490
3491 add_function("shadow1D",
3492 _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
3493 _texture(ir_txb, v110_derivatives_only, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
3494 NULL);
3495
3496 add_function("shadow1DArray",
3497 _texture(ir_tex, texture_array, glsl_type::vec4_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type),
3498 _texture(ir_txb, texture_array_derivs_only, glsl_type::vec4_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type),
3499 NULL);
3500
3501 add_function("shadow2D",
3502 _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
3503 _texture(ir_txb, v110_derivatives_only, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
3504 NULL);
3505
3506 add_function("shadow2DArray",
3507 _texture(ir_tex, texture_array, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type),
3508 _texture(ir_txb, texture_array_derivs_only, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type),
3509 NULL);
3510
3511 add_function("shadow1DProj",
3512 _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3513 _texture(ir_txb, v110_derivatives_only, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3514 NULL);
3515
3516 add_function("shadow2DArray",
3517 _texture(ir_tex, texture_array, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type),
3518 _texture(ir_txb, texture_array_derivs_only, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type),
3519 NULL);
3520
3521 add_function("shadowCube",
3522 _texture(ir_tex, gpu_shader4, glsl_type::vec4_type, glsl_type::samplerCubeShadow_type, glsl_type::vec4_type),
3523 _texture(ir_txb, gpu_shader4_derivs_only, glsl_type::vec4_type, glsl_type::samplerCubeShadow_type, glsl_type::vec4_type),
3524 NULL);
3525
3526 add_function("shadow2DProj",
3527 _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3528 _texture(ir_txb, v110_derivatives_only, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3529 NULL);
3530
3531 add_function("shadow1DLod",
3532 _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
3533 NULL);
3534
3535 add_function("shadow2DLod",
3536 _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
3537 NULL);
3538
3539 add_function("shadow1DArrayLod",
3540 _texture(ir_txl, texture_array_lod, glsl_type::vec4_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type),
3541 NULL);
3542
3543 add_function("shadow1DProjLod",
3544 _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3545 NULL);
3546
3547 add_function("shadow2DProjLod",
3548 _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3549 NULL);
3550
3551 add_function("shadow2DRect",
3552 _texture(ir_tex, texture_rectangle, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type),
3553 NULL);
3554
3555 add_function("shadow2DRectProj",
3556 _texture(ir_tex, texture_rectangle, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3557 NULL);
3558
3559 add_function("texture1DGradARB",
3560 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
3561 NULL);
3562
3563 add_function("texture1DProjGradARB",
3564 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3565 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3566 NULL);
3567
3568 add_function("texture2DGradARB",
3569 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
3570 NULL);
3571
3572 add_function("texture2DProjGradARB",
3573 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3574 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3575 NULL);
3576
3577 add_function("texture3DGradARB",
3578 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
3579 NULL);
3580
3581 add_function("texture3DProjGradARB",
3582 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3583 NULL);
3584
3585 add_function("textureCubeGradARB",
3586 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
3587 NULL);
3588
3589 add_function("shadow1DGradARB",
3590 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
3591 NULL);
3592
3593 add_function("shadow1DProjGradARB",
3594 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3595 NULL);
3596
3597 add_function("shadow2DGradARB",
3598 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
3599 NULL);
3600
3601 add_function("shadow2DProjGradARB",
3602 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3603 NULL);
3604
3605 add_function("texture2DRectGradARB",
3606 _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type),
3607 NULL);
3608
3609 add_function("texture2DRectProjGradARB",
3610 _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
3611 _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
3612 NULL);
3613
3614 add_function("shadow2DRectGradARB",
3615 _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type),
3616 NULL);
3617
3618 add_function("shadow2DRectProjGradARB",
3619 _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3620 NULL);
3621
3622 add_function("texture4",
3623 _texture(ir_tg4, texture_texture4, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
3624 NULL);
3625
3626 add_function("texture1DGrad",
3627 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
3628 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type),
3629 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type),
3630 NULL);
3631
3632 add_function("texture1DProjGrad",
3633 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3634 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3635 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3636 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3637 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
3638 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
3639 NULL);
3640
3641 add_function("texture1DArrayGrad",
3642 _texture(ir_txd, gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type),
3643 _texture(ir_txd, gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type),
3644 _texture(ir_txd, gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type),
3645 NULL);
3646
3647 add_function("texture2DGrad",
3648 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
3649 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type),
3650 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type),
3651 NULL);
3652
3653 add_function("texture2DProjGrad",
3654 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3655 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3656 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3657 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3658 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
3659 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
3660 NULL);
3661
3662 add_function("texture2DArrayGrad",
3663 _texture(ir_txd, gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
3664 _texture(ir_txd, gpu_shader4_array_integer, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type),
3665 _texture(ir_txd, gpu_shader4_array_integer, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type),
3666 NULL);
3667
3668 add_function("texture3DGrad",
3669 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
3670 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type),
3671 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type),
3672 NULL);
3673
3674 add_function("texture3DProjGrad",
3675 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3676 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3677 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
3678 NULL);
3679
3680 add_function("textureCubeGrad",
3681 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
3682 _texture(ir_txd, gpu_shader4_integer, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type),
3683 _texture(ir_txd, gpu_shader4_integer, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type),
3684 NULL);
3685
3686 add_function("shadow1DGrad",
3687 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
3688 NULL);
3689
3690 add_function("shadow1DProjGrad",
3691 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3692 NULL);
3693
3694 add_function("shadow1DArrayGrad",
3695 _texture(ir_txd, gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type),
3696 NULL);
3697
3698 add_function("shadow2DGrad",
3699 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
3700 NULL);
3701
3702 add_function("shadow2DProjGrad",
3703 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3704 NULL);
3705
3706 add_function("shadow2DArrayGrad",
3707 _texture(ir_txd, gpu_shader4_array, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type),
3708 NULL);
3709
3710 add_function("texture2DRectGrad",
3711 _texture(ir_txd, gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type),
3712 _texture(ir_txd, gpu_shader4_rect_integer, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type),
3713 _texture(ir_txd, gpu_shader4_rect_integer, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type),
3714 NULL);
3715
3716 add_function("texture2DRectProjGrad",
3717 _texture(ir_txd, gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
3718 _texture(ir_txd, gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
3719 _texture(ir_txd, gpu_shader4_rect_integer, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
3720 _texture(ir_txd, gpu_shader4_rect_integer, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
3721 _texture(ir_txd, gpu_shader4_rect_integer, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
3722 _texture(ir_txd, gpu_shader4_rect_integer, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
3723 NULL);
3724
3725 add_function("shadow2DRectGrad",
3726 _texture(ir_txd, gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type),
3727 NULL);
3728
3729 add_function("shadow2DRectProjGrad",
3730 _texture(ir_txd, gpu_shader4_rect, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT),
3731 NULL);
3732
3733 add_function("shadowCubeGrad",
3734 _texture(ir_txd, gpu_shader4, glsl_type::vec4_type, glsl_type::samplerCubeShadow_type, glsl_type::vec4_type),
3735 NULL);
3736
3737 add_function("textureGather",
3738 _texture(ir_tg4, texture_gather_or_es31, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
3739 _texture(ir_tg4, texture_gather_or_es31, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type),
3740 _texture(ir_tg4, texture_gather_or_es31, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type),
3741
3742 _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type),
3743 _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type),
3744 _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type),
3745
3746 _texture(ir_tg4, texture_gather_or_es31, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
3747 _texture(ir_tg4, texture_gather_or_es31, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type),
3748 _texture(ir_tg4, texture_gather_or_es31, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type),
3749
3750 _texture(ir_tg4, texture_gather_or_es31, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
3751 _texture(ir_tg4, texture_gather_or_es31, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type),
3752 _texture(ir_tg4, texture_gather_or_es31, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type),
3753
3754 _texture(ir_tg4, texture_gather_cube_map_array, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type),
3755 _texture(ir_tg4, texture_gather_cube_map_array, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type),
3756 _texture(ir_tg4, texture_gather_cube_map_array, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type),
3757
3758 _texture(ir_tg4, gpu_shader5_or_es31, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_COMPONENT),
3759 _texture(ir_tg4, gpu_shader5_or_es31, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_COMPONENT),
3760 _texture(ir_tg4, gpu_shader5_or_es31, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_COMPONENT),
3761
3762 _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_COMPONENT),
3763 _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_COMPONENT),
3764 _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_COMPONENT),
3765
3766 _texture(ir_tg4, gpu_shader5_or_es31, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_COMPONENT),
3767 _texture(ir_tg4, gpu_shader5_or_es31, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_COMPONENT),
3768 _texture(ir_tg4, gpu_shader5_or_es31, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_COMPONENT),
3769
3770 _texture(ir_tg4, gpu_shader5_or_es31, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type, TEX_COMPONENT),
3771 _texture(ir_tg4, gpu_shader5_or_es31, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type, TEX_COMPONENT),
3772 _texture(ir_tg4, gpu_shader5_or_es31, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type, TEX_COMPONENT),
3773
3774 _texture(ir_tg4, gpu_shader5_or_OES_texture_cube_map_array, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type, TEX_COMPONENT),
3775 _texture(ir_tg4, gpu_shader5_or_OES_texture_cube_map_array, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type, TEX_COMPONENT),
3776 _texture(ir_tg4, gpu_shader5_or_OES_texture_cube_map_array, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type, TEX_COMPONENT),
3777
3778 _texture(ir_tg4, gpu_shader5_or_es31, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec2_type),
3779 _texture(ir_tg4, gpu_shader5_or_es31, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec3_type),
3780 _texture(ir_tg4, gpu_shader5_or_es31, glsl_type::vec4_type, glsl_type::samplerCubeShadow_type, glsl_type::vec3_type),
3781 _texture(ir_tg4, gpu_shader5_or_OES_texture_cube_map_array, glsl_type::vec4_type, glsl_type::samplerCubeArrayShadow_type, glsl_type::vec4_type),
3782 _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec2_type),
3783 NULL);
3784
3785 add_function("textureGatherOffset",
3786 _texture(ir_tg4, texture_gather_only_or_es31, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
3787 _texture(ir_tg4, texture_gather_only_or_es31, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
3788 _texture(ir_tg4, texture_gather_only_or_es31, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
3789
3790 _texture(ir_tg4, texture_gather_only_or_es31, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
3791 _texture(ir_tg4, texture_gather_only_or_es31, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
3792 _texture(ir_tg4, texture_gather_only_or_es31, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
3793
3794 _texture(ir_tg4, es31_not_gs5, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET | TEX_COMPONENT),
3795 _texture(ir_tg4, es31_not_gs5, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET | TEX_COMPONENT),
3796 _texture(ir_tg4, es31_not_gs5, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET | TEX_COMPONENT),
3797
3798 _texture(ir_tg4, es31_not_gs5, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET | TEX_COMPONENT),
3799 _texture(ir_tg4, es31_not_gs5, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET | TEX_COMPONENT),
3800 _texture(ir_tg4, es31_not_gs5, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET | TEX_COMPONENT),
3801
3802 _texture(ir_tg4, gpu_shader5_es, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST),
3803 _texture(ir_tg4, gpu_shader5_es, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST),
3804 _texture(ir_tg4, gpu_shader5_es, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST),
3805
3806 _texture(ir_tg4, gpu_shader5_es, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_NONCONST),
3807 _texture(ir_tg4, gpu_shader5_es, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_NONCONST),
3808 _texture(ir_tg4, gpu_shader5_es, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_NONCONST),
3809
3810 _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST),
3811 _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST),
3812 _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST),
3813
3814 _texture(ir_tg4, gpu_shader5_es, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST | TEX_COMPONENT),
3815 _texture(ir_tg4, gpu_shader5_es, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST | TEX_COMPONENT),
3816 _texture(ir_tg4, gpu_shader5_es, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST | TEX_COMPONENT),
3817
3818 _texture(ir_tg4, gpu_shader5_es, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_NONCONST | TEX_COMPONENT),
3819 _texture(ir_tg4, gpu_shader5_es, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_NONCONST | TEX_COMPONENT),
3820 _texture(ir_tg4, gpu_shader5_es, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_NONCONST | TEX_COMPONENT),
3821
3822 _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST | TEX_COMPONENT),
3823 _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST | TEX_COMPONENT),
3824 _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST | TEX_COMPONENT),
3825
3826 _texture(ir_tg4, gpu_shader5_es, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST),
3827 _texture(ir_tg4, gpu_shader5_es, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET_NONCONST),
3828 _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec2_type, TEX_OFFSET_NONCONST),
3829
3830 _texture(ir_tg4, es31_not_gs5, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec2_type, TEX_OFFSET),
3831 _texture(ir_tg4, es31_not_gs5, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET),
3832 NULL);
3833
3834 add_function("textureGatherOffsets",
3835 _texture(ir_tg4, gpu_shader5_es, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY),
3836 _texture(ir_tg4, gpu_shader5_es, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY),
3837 _texture(ir_tg4, gpu_shader5_es, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY),
3838
3839 _texture(ir_tg4, gpu_shader5_es, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY | TEX_COMPONENT),
3840 _texture(ir_tg4, gpu_shader5_es, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY | TEX_COMPONENT),
3841 _texture(ir_tg4, gpu_shader5_es, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY | TEX_COMPONENT),
3842
3843 _texture(ir_tg4, gpu_shader5_es, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_ARRAY),
3844 _texture(ir_tg4, gpu_shader5_es, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_ARRAY),
3845 _texture(ir_tg4, gpu_shader5_es, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_ARRAY),
3846
3847 _texture(ir_tg4, gpu_shader5_es, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_ARRAY | TEX_COMPONENT),
3848 _texture(ir_tg4, gpu_shader5_es, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_ARRAY | TEX_COMPONENT),
3849 _texture(ir_tg4, gpu_shader5_es, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET_ARRAY | TEX_COMPONENT),
3850
3851 _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY),
3852 _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY),
3853 _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY),
3854
3855 _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY | TEX_COMPONENT),
3856 _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY | TEX_COMPONENT),
3857 _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY | TEX_COMPONENT),
3858
3859 _texture(ir_tg4, gpu_shader5_es, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY),
3860 _texture(ir_tg4, gpu_shader5_es, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET_ARRAY),
3861 _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec2_type, TEX_OFFSET_ARRAY),
3862 NULL);
3863
3864 F(dFdx)
3865 F(dFdy)
3866 F(fwidth)
3867 F(dFdxCoarse)
3868 F(dFdyCoarse)
3869 F(fwidthCoarse)
3870 F(dFdxFine)
3871 F(dFdyFine)
3872 F(fwidthFine)
3873 F(noise1)
3874 F(noise2)
3875 F(noise3)
3876 F(noise4)
3877
3878 IU(bitfieldExtract)
3879 IU(bitfieldInsert)
3880 IU(bitfieldReverse)
3881 IU(bitCount)
3882 IU(findLSB)
3883 IU(findMSB)
3884 FDGS5(fma)
3885
3886 add_function("ldexp",
3887 _ldexp(glsl_type::float_type, glsl_type::int_type),
3888 _ldexp(glsl_type::vec2_type, glsl_type::ivec2_type),
3889 _ldexp(glsl_type::vec3_type, glsl_type::ivec3_type),
3890 _ldexp(glsl_type::vec4_type, glsl_type::ivec4_type),
3891 _ldexp(glsl_type::double_type, glsl_type::int_type),
3892 _ldexp(glsl_type::dvec2_type, glsl_type::ivec2_type),
3893 _ldexp(glsl_type::dvec3_type, glsl_type::ivec3_type),
3894 _ldexp(glsl_type::dvec4_type, glsl_type::ivec4_type),
3895 NULL);
3896
3897 add_function("frexp",
3898 _frexp(glsl_type::float_type, glsl_type::int_type),
3899 _frexp(glsl_type::vec2_type, glsl_type::ivec2_type),
3900 _frexp(glsl_type::vec3_type, glsl_type::ivec3_type),
3901 _frexp(glsl_type::vec4_type, glsl_type::ivec4_type),
3902 _dfrexp(glsl_type::double_type, glsl_type::int_type),
3903 _dfrexp(glsl_type::dvec2_type, glsl_type::ivec2_type),
3904 _dfrexp(glsl_type::dvec3_type, glsl_type::ivec3_type),
3905 _dfrexp(glsl_type::dvec4_type, glsl_type::ivec4_type),
3906 NULL);
3907 add_function("uaddCarry",
3908 _uaddCarry(glsl_type::uint_type),
3909 _uaddCarry(glsl_type::uvec2_type),
3910 _uaddCarry(glsl_type::uvec3_type),
3911 _uaddCarry(glsl_type::uvec4_type),
3912 NULL);
3913 add_function("usubBorrow",
3914 _usubBorrow(glsl_type::uint_type),
3915 _usubBorrow(glsl_type::uvec2_type),
3916 _usubBorrow(glsl_type::uvec3_type),
3917 _usubBorrow(glsl_type::uvec4_type),
3918 NULL);
3919 add_function("imulExtended",
3920 _mulExtended(glsl_type::int_type),
3921 _mulExtended(glsl_type::ivec2_type),
3922 _mulExtended(glsl_type::ivec3_type),
3923 _mulExtended(glsl_type::ivec4_type),
3924 NULL);
3925 add_function("umulExtended",
3926 _mulExtended(glsl_type::uint_type),
3927 _mulExtended(glsl_type::uvec2_type),
3928 _mulExtended(glsl_type::uvec3_type),
3929 _mulExtended(glsl_type::uvec4_type),
3930 NULL);
3931 add_function("interpolateAtCentroid",
3932 _interpolateAtCentroid(glsl_type::float_type),
3933 _interpolateAtCentroid(glsl_type::vec2_type),
3934 _interpolateAtCentroid(glsl_type::vec3_type),
3935 _interpolateAtCentroid(glsl_type::vec4_type),
3936 NULL);
3937 add_function("interpolateAtOffset",
3938 _interpolateAtOffset(glsl_type::float_type),
3939 _interpolateAtOffset(glsl_type::vec2_type),
3940 _interpolateAtOffset(glsl_type::vec3_type),
3941 _interpolateAtOffset(glsl_type::vec4_type),
3942 NULL);
3943 add_function("interpolateAtSample",
3944 _interpolateAtSample(glsl_type::float_type),
3945 _interpolateAtSample(glsl_type::vec2_type),
3946 _interpolateAtSample(glsl_type::vec3_type),
3947 _interpolateAtSample(glsl_type::vec4_type),
3948 NULL);
3949
3950 add_function("atomicCounter",
3951 _atomic_counter_op("__intrinsic_atomic_read",
3952 shader_atomic_counters),
3953 NULL);
3954 add_function("atomicCounterIncrement",
3955 _atomic_counter_op("__intrinsic_atomic_increment",
3956 shader_atomic_counters),
3957 NULL);
3958 add_function("atomicCounterDecrement",
3959 _atomic_counter_op("__intrinsic_atomic_predecrement",
3960 shader_atomic_counters),
3961 NULL);
3962
3963 add_function("atomicCounterAddARB",
3964 _atomic_counter_op1("__intrinsic_atomic_add",
3965 shader_atomic_counter_ops),
3966 NULL);
3967 add_function("atomicCounterSubtractARB",
3968 _atomic_counter_op1("__intrinsic_atomic_sub",
3969 shader_atomic_counter_ops),
3970 NULL);
3971 add_function("atomicCounterMinARB",
3972 _atomic_counter_op1("__intrinsic_atomic_min",
3973 shader_atomic_counter_ops),
3974 NULL);
3975 add_function("atomicCounterMaxARB",
3976 _atomic_counter_op1("__intrinsic_atomic_max",
3977 shader_atomic_counter_ops),
3978 NULL);
3979 add_function("atomicCounterAndARB",
3980 _atomic_counter_op1("__intrinsic_atomic_and",
3981 shader_atomic_counter_ops),
3982 NULL);
3983 add_function("atomicCounterOrARB",
3984 _atomic_counter_op1("__intrinsic_atomic_or",
3985 shader_atomic_counter_ops),
3986 NULL);
3987 add_function("atomicCounterXorARB",
3988 _atomic_counter_op1("__intrinsic_atomic_xor",
3989 shader_atomic_counter_ops),
3990 NULL);
3991 add_function("atomicCounterExchangeARB",
3992 _atomic_counter_op1("__intrinsic_atomic_exchange",
3993 shader_atomic_counter_ops),
3994 NULL);
3995 add_function("atomicCounterCompSwapARB",
3996 _atomic_counter_op2("__intrinsic_atomic_comp_swap",
3997 shader_atomic_counter_ops),
3998 NULL);
3999
4000 add_function("atomicCounterAdd",
4001 _atomic_counter_op1("__intrinsic_atomic_add",
4002 v460_desktop),
4003 NULL);
4004 add_function("atomicCounterSubtract",
4005 _atomic_counter_op1("__intrinsic_atomic_sub",
4006 v460_desktop),
4007 NULL);
4008 add_function("atomicCounterMin",
4009 _atomic_counter_op1("__intrinsic_atomic_min",
4010 v460_desktop),
4011 NULL);
4012 add_function("atomicCounterMax",
4013 _atomic_counter_op1("__intrinsic_atomic_max",
4014 v460_desktop),
4015 NULL);
4016 add_function("atomicCounterAnd",
4017 _atomic_counter_op1("__intrinsic_atomic_and",
4018 v460_desktop),
4019 NULL);
4020 add_function("atomicCounterOr",
4021 _atomic_counter_op1("__intrinsic_atomic_or",
4022 v460_desktop),
4023 NULL);
4024 add_function("atomicCounterXor",
4025 _atomic_counter_op1("__intrinsic_atomic_xor",
4026 v460_desktop),
4027 NULL);
4028 add_function("atomicCounterExchange",
4029 _atomic_counter_op1("__intrinsic_atomic_exchange",
4030 v460_desktop),
4031 NULL);
4032 add_function("atomicCounterCompSwap",
4033 _atomic_counter_op2("__intrinsic_atomic_comp_swap",
4034 v460_desktop),
4035 NULL);
4036
4037 add_function("atomicAdd",
4038 _atomic_op2("__intrinsic_atomic_add",
4039 buffer_atomics_supported,
4040 glsl_type::uint_type),
4041 _atomic_op2("__intrinsic_atomic_add",
4042 buffer_atomics_supported,
4043 glsl_type::int_type),
4044 _atomic_op2("__intrinsic_atomic_add",
4045 shader_atomic_float_add,
4046 glsl_type::float_type),
4047 NULL);
4048 add_function("atomicMin",
4049 _atomic_op2("__intrinsic_atomic_min",
4050 buffer_atomics_supported,
4051 glsl_type::uint_type),
4052 _atomic_op2("__intrinsic_atomic_min",
4053 buffer_atomics_supported,
4054 glsl_type::int_type),
4055 _atomic_op2("__intrinsic_atomic_min",
4056 shader_atomic_float_minmax,
4057 glsl_type::float_type),
4058 NULL);
4059 add_function("atomicMax",
4060 _atomic_op2("__intrinsic_atomic_max",
4061 buffer_atomics_supported,
4062 glsl_type::uint_type),
4063 _atomic_op2("__intrinsic_atomic_max",
4064 buffer_atomics_supported,
4065 glsl_type::int_type),
4066 _atomic_op2("__intrinsic_atomic_max",
4067 shader_atomic_float_minmax,
4068 glsl_type::float_type),
4069 NULL);
4070 add_function("atomicAnd",
4071 _atomic_op2("__intrinsic_atomic_and",
4072 buffer_atomics_supported,
4073 glsl_type::uint_type),
4074 _atomic_op2("__intrinsic_atomic_and",
4075 buffer_atomics_supported,
4076 glsl_type::int_type),
4077 NULL);
4078 add_function("atomicOr",
4079 _atomic_op2("__intrinsic_atomic_or",
4080 buffer_atomics_supported,
4081 glsl_type::uint_type),
4082 _atomic_op2("__intrinsic_atomic_or",
4083 buffer_atomics_supported,
4084 glsl_type::int_type),
4085 NULL);
4086 add_function("atomicXor",
4087 _atomic_op2("__intrinsic_atomic_xor",
4088 buffer_atomics_supported,
4089 glsl_type::uint_type),
4090 _atomic_op2("__intrinsic_atomic_xor",
4091 buffer_atomics_supported,
4092 glsl_type::int_type),
4093 NULL);
4094 add_function("atomicExchange",
4095 _atomic_op2("__intrinsic_atomic_exchange",
4096 buffer_atomics_supported,
4097 glsl_type::uint_type),
4098 _atomic_op2("__intrinsic_atomic_exchange",
4099 buffer_atomics_supported,
4100 glsl_type::int_type),
4101 _atomic_op2("__intrinsic_atomic_exchange",
4102 shader_atomic_float_exchange,
4103 glsl_type::float_type),
4104 NULL);
4105 add_function("atomicCompSwap",
4106 _atomic_op3("__intrinsic_atomic_comp_swap",
4107 buffer_atomics_supported,
4108 glsl_type::uint_type),
4109 _atomic_op3("__intrinsic_atomic_comp_swap",
4110 buffer_atomics_supported,
4111 glsl_type::int_type),
4112 _atomic_op3("__intrinsic_atomic_comp_swap",
4113 shader_atomic_float_minmax,
4114 glsl_type::float_type),
4115 NULL);
4116
4117 add_function("min3",
4118 _min3(glsl_type::float_type),
4119 _min3(glsl_type::vec2_type),
4120 _min3(glsl_type::vec3_type),
4121 _min3(glsl_type::vec4_type),
4122
4123 _min3(glsl_type::int_type),
4124 _min3(glsl_type::ivec2_type),
4125 _min3(glsl_type::ivec3_type),
4126 _min3(glsl_type::ivec4_type),
4127
4128 _min3(glsl_type::uint_type),
4129 _min3(glsl_type::uvec2_type),
4130 _min3(glsl_type::uvec3_type),
4131 _min3(glsl_type::uvec4_type),
4132 NULL);
4133
4134 add_function("max3",
4135 _max3(glsl_type::float_type),
4136 _max3(glsl_type::vec2_type),
4137 _max3(glsl_type::vec3_type),
4138 _max3(glsl_type::vec4_type),
4139
4140 _max3(glsl_type::int_type),
4141 _max3(glsl_type::ivec2_type),
4142 _max3(glsl_type::ivec3_type),
4143 _max3(glsl_type::ivec4_type),
4144
4145 _max3(glsl_type::uint_type),
4146 _max3(glsl_type::uvec2_type),
4147 _max3(glsl_type::uvec3_type),
4148 _max3(glsl_type::uvec4_type),
4149 NULL);
4150
4151 add_function("mid3",
4152 _mid3(glsl_type::float_type),
4153 _mid3(glsl_type::vec2_type),
4154 _mid3(glsl_type::vec3_type),
4155 _mid3(glsl_type::vec4_type),
4156
4157 _mid3(glsl_type::int_type),
4158 _mid3(glsl_type::ivec2_type),
4159 _mid3(glsl_type::ivec3_type),
4160 _mid3(glsl_type::ivec4_type),
4161
4162 _mid3(glsl_type::uint_type),
4163 _mid3(glsl_type::uvec2_type),
4164 _mid3(glsl_type::uvec3_type),
4165 _mid3(glsl_type::uvec4_type),
4166 NULL);
4167
4168 add_image_functions(true);
4169
4170 add_function("memoryBarrier",
4171 _memory_barrier("__intrinsic_memory_barrier",
4172 shader_image_load_store),
4173 NULL);
4174 add_function("groupMemoryBarrier",
4175 _memory_barrier("__intrinsic_group_memory_barrier",
4176 compute_shader),
4177 NULL);
4178 add_function("memoryBarrierAtomicCounter",
4179 _memory_barrier("__intrinsic_memory_barrier_atomic_counter",
4180 compute_shader_supported),
4181 NULL);
4182 add_function("memoryBarrierBuffer",
4183 _memory_barrier("__intrinsic_memory_barrier_buffer",
4184 compute_shader_supported),
4185 NULL);
4186 add_function("memoryBarrierImage",
4187 _memory_barrier("__intrinsic_memory_barrier_image",
4188 compute_shader_supported),
4189 NULL);
4190 add_function("memoryBarrierShared",
4191 _memory_barrier("__intrinsic_memory_barrier_shared",
4192 compute_shader),
4193 NULL);
4194
4195 add_function("ballotARB", _ballot(), NULL);
4196
4197 add_function("readInvocationARB",
4198 _read_invocation(glsl_type::float_type),
4199 _read_invocation(glsl_type::vec2_type),
4200 _read_invocation(glsl_type::vec3_type),
4201 _read_invocation(glsl_type::vec4_type),
4202
4203 _read_invocation(glsl_type::int_type),
4204 _read_invocation(glsl_type::ivec2_type),
4205 _read_invocation(glsl_type::ivec3_type),
4206 _read_invocation(glsl_type::ivec4_type),
4207
4208 _read_invocation(glsl_type::uint_type),
4209 _read_invocation(glsl_type::uvec2_type),
4210 _read_invocation(glsl_type::uvec3_type),
4211 _read_invocation(glsl_type::uvec4_type),
4212 NULL);
4213
4214 add_function("readFirstInvocationARB",
4215 _read_first_invocation(glsl_type::float_type),
4216 _read_first_invocation(glsl_type::vec2_type),
4217 _read_first_invocation(glsl_type::vec3_type),
4218 _read_first_invocation(glsl_type::vec4_type),
4219
4220 _read_first_invocation(glsl_type::int_type),
4221 _read_first_invocation(glsl_type::ivec2_type),
4222 _read_first_invocation(glsl_type::ivec3_type),
4223 _read_first_invocation(glsl_type::ivec4_type),
4224
4225 _read_first_invocation(glsl_type::uint_type),
4226 _read_first_invocation(glsl_type::uvec2_type),
4227 _read_first_invocation(glsl_type::uvec3_type),
4228 _read_first_invocation(glsl_type::uvec4_type),
4229 NULL);
4230
4231 add_function("clock2x32ARB",
4232 _shader_clock(shader_clock,
4233 glsl_type::uvec2_type),
4234 NULL);
4235
4236 add_function("clockARB",
4237 _shader_clock(shader_clock_int64,
4238 glsl_type::uint64_t_type),
4239 NULL);
4240
4241 add_function("beginInvocationInterlockARB",
4242 _invocation_interlock(
4243 "__intrinsic_begin_invocation_interlock",
4244 supports_arb_fragment_shader_interlock),
4245 NULL);
4246
4247 add_function("endInvocationInterlockARB",
4248 _invocation_interlock(
4249 "__intrinsic_end_invocation_interlock",
4250 supports_arb_fragment_shader_interlock),
4251 NULL);
4252
4253 add_function("beginInvocationInterlockNV",
4254 _invocation_interlock(
4255 "__intrinsic_begin_invocation_interlock",
4256 supports_nv_fragment_shader_interlock),
4257 NULL);
4258
4259 add_function("endInvocationInterlockNV",
4260 _invocation_interlock(
4261 "__intrinsic_end_invocation_interlock",
4262 supports_nv_fragment_shader_interlock),
4263 NULL);
4264
4265 add_function("anyInvocationARB",
4266 _vote("__intrinsic_vote_any", vote),
4267 NULL);
4268
4269 add_function("allInvocationsARB",
4270 _vote("__intrinsic_vote_all", vote),
4271 NULL);
4272
4273 add_function("allInvocationsEqualARB",
4274 _vote("__intrinsic_vote_eq", vote),
4275 NULL);
4276
4277 add_function("anyInvocation",
4278 _vote("__intrinsic_vote_any", v460_desktop),
4279 NULL);
4280
4281 add_function("allInvocations",
4282 _vote("__intrinsic_vote_all", v460_desktop),
4283 NULL);
4284
4285 add_function("allInvocationsEqual",
4286 _vote("__intrinsic_vote_eq", v460_desktop),
4287 NULL);
4288
4289 add_function("helperInvocationEXT", _helper_invocation(), NULL);
4290
4291 add_function("__builtin_idiv64",
4292 generate_ir::idiv64(mem_ctx, integer_functions_supported),
4293 NULL);
4294
4295 add_function("__builtin_imod64",
4296 generate_ir::imod64(mem_ctx, integer_functions_supported),
4297 NULL);
4298
4299 add_function("__builtin_sign64",
4300 generate_ir::sign64(mem_ctx, integer_functions_supported),
4301 NULL);
4302
4303 add_function("__builtin_udiv64",
4304 generate_ir::udiv64(mem_ctx, integer_functions_supported),
4305 NULL);
4306
4307 add_function("__builtin_umod64",
4308 generate_ir::umod64(mem_ctx, integer_functions_supported),
4309 NULL);
4310
4311 add_function("__builtin_umul64",
4312 generate_ir::umul64(mem_ctx, integer_functions_supported),
4313 NULL);
4314
4315 add_function("countLeadingZeros",
4316 _countLeadingZeros(shader_integer_functions2,
4317 glsl_type::uint_type),
4318 _countLeadingZeros(shader_integer_functions2,
4319 glsl_type::uvec2_type),
4320 _countLeadingZeros(shader_integer_functions2,
4321 glsl_type::uvec3_type),
4322 _countLeadingZeros(shader_integer_functions2,
4323 glsl_type::uvec4_type),
4324 NULL);
4325
4326 add_function("countTrailingZeros",
4327 _countTrailingZeros(shader_integer_functions2,
4328 glsl_type::uint_type),
4329 _countTrailingZeros(shader_integer_functions2,
4330 glsl_type::uvec2_type),
4331 _countTrailingZeros(shader_integer_functions2,
4332 glsl_type::uvec3_type),
4333 _countTrailingZeros(shader_integer_functions2,
4334 glsl_type::uvec4_type),
4335 NULL);
4336
4337 add_function("absoluteDifference",
4338 _absoluteDifference(shader_integer_functions2,
4339 glsl_type::int_type),
4340 _absoluteDifference(shader_integer_functions2,
4341 glsl_type::ivec2_type),
4342 _absoluteDifference(shader_integer_functions2,
4343 glsl_type::ivec3_type),
4344 _absoluteDifference(shader_integer_functions2,
4345 glsl_type::ivec4_type),
4346 _absoluteDifference(shader_integer_functions2,
4347 glsl_type::uint_type),
4348 _absoluteDifference(shader_integer_functions2,
4349 glsl_type::uvec2_type),
4350 _absoluteDifference(shader_integer_functions2,
4351 glsl_type::uvec3_type),
4352 _absoluteDifference(shader_integer_functions2,
4353 glsl_type::uvec4_type),
4354
4355 _absoluteDifference(shader_integer_functions2_int64,
4356 glsl_type::int64_t_type),
4357 _absoluteDifference(shader_integer_functions2_int64,
4358 glsl_type::i64vec2_type),
4359 _absoluteDifference(shader_integer_functions2_int64,
4360 glsl_type::i64vec3_type),
4361 _absoluteDifference(shader_integer_functions2_int64,
4362 glsl_type::i64vec4_type),
4363 _absoluteDifference(shader_integer_functions2_int64,
4364 glsl_type::uint64_t_type),
4365 _absoluteDifference(shader_integer_functions2_int64,
4366 glsl_type::u64vec2_type),
4367 _absoluteDifference(shader_integer_functions2_int64,
4368 glsl_type::u64vec3_type),
4369 _absoluteDifference(shader_integer_functions2_int64,
4370 glsl_type::u64vec4_type),
4371 NULL);
4372
4373 add_function("addSaturate",
4374 _addSaturate(shader_integer_functions2,
4375 glsl_type::int_type),
4376 _addSaturate(shader_integer_functions2,
4377 glsl_type::ivec2_type),
4378 _addSaturate(shader_integer_functions2,
4379 glsl_type::ivec3_type),
4380 _addSaturate(shader_integer_functions2,
4381 glsl_type::ivec4_type),
4382 _addSaturate(shader_integer_functions2,
4383 glsl_type::uint_type),
4384 _addSaturate(shader_integer_functions2,
4385 glsl_type::uvec2_type),
4386 _addSaturate(shader_integer_functions2,
4387 glsl_type::uvec3_type),
4388 _addSaturate(shader_integer_functions2,
4389 glsl_type::uvec4_type),
4390
4391 _addSaturate(shader_integer_functions2_int64,
4392 glsl_type::int64_t_type),
4393 _addSaturate(shader_integer_functions2_int64,
4394 glsl_type::i64vec2_type),
4395 _addSaturate(shader_integer_functions2_int64,
4396 glsl_type::i64vec3_type),
4397 _addSaturate(shader_integer_functions2_int64,
4398 glsl_type::i64vec4_type),
4399 _addSaturate(shader_integer_functions2_int64,
4400 glsl_type::uint64_t_type),
4401 _addSaturate(shader_integer_functions2_int64,
4402 glsl_type::u64vec2_type),
4403 _addSaturate(shader_integer_functions2_int64,
4404 glsl_type::u64vec3_type),
4405 _addSaturate(shader_integer_functions2_int64,
4406 glsl_type::u64vec4_type),
4407 NULL);
4408
4409 add_function("average",
4410 _average(shader_integer_functions2,
4411 glsl_type::int_type),
4412 _average(shader_integer_functions2,
4413 glsl_type::ivec2_type),
4414 _average(shader_integer_functions2,
4415 glsl_type::ivec3_type),
4416 _average(shader_integer_functions2,
4417 glsl_type::ivec4_type),
4418 _average(shader_integer_functions2,
4419 glsl_type::uint_type),
4420 _average(shader_integer_functions2,
4421 glsl_type::uvec2_type),
4422 _average(shader_integer_functions2,
4423 glsl_type::uvec3_type),
4424 _average(shader_integer_functions2,
4425 glsl_type::uvec4_type),
4426
4427 _average(shader_integer_functions2_int64,
4428 glsl_type::int64_t_type),
4429 _average(shader_integer_functions2_int64,
4430 glsl_type::i64vec2_type),
4431 _average(shader_integer_functions2_int64,
4432 glsl_type::i64vec3_type),
4433 _average(shader_integer_functions2_int64,
4434 glsl_type::i64vec4_type),
4435 _average(shader_integer_functions2_int64,
4436 glsl_type::uint64_t_type),
4437 _average(shader_integer_functions2_int64,
4438 glsl_type::u64vec2_type),
4439 _average(shader_integer_functions2_int64,
4440 glsl_type::u64vec3_type),
4441 _average(shader_integer_functions2_int64,
4442 glsl_type::u64vec4_type),
4443 NULL);
4444
4445 add_function("averageRounded",
4446 _averageRounded(shader_integer_functions2,
4447 glsl_type::int_type),
4448 _averageRounded(shader_integer_functions2,
4449 glsl_type::ivec2_type),
4450 _averageRounded(shader_integer_functions2,
4451 glsl_type::ivec3_type),
4452 _averageRounded(shader_integer_functions2,
4453 glsl_type::ivec4_type),
4454 _averageRounded(shader_integer_functions2,
4455 glsl_type::uint_type),
4456 _averageRounded(shader_integer_functions2,
4457 glsl_type::uvec2_type),
4458 _averageRounded(shader_integer_functions2,
4459 glsl_type::uvec3_type),
4460 _averageRounded(shader_integer_functions2,
4461 glsl_type::uvec4_type),
4462
4463 _averageRounded(shader_integer_functions2_int64,
4464 glsl_type::int64_t_type),
4465 _averageRounded(shader_integer_functions2_int64,
4466 glsl_type::i64vec2_type),
4467 _averageRounded(shader_integer_functions2_int64,
4468 glsl_type::i64vec3_type),
4469 _averageRounded(shader_integer_functions2_int64,
4470 glsl_type::i64vec4_type),
4471 _averageRounded(shader_integer_functions2_int64,
4472 glsl_type::uint64_t_type),
4473 _averageRounded(shader_integer_functions2_int64,
4474 glsl_type::u64vec2_type),
4475 _averageRounded(shader_integer_functions2_int64,
4476 glsl_type::u64vec3_type),
4477 _averageRounded(shader_integer_functions2_int64,
4478 glsl_type::u64vec4_type),
4479 NULL);
4480
4481 add_function("subtractSaturate",
4482 _subtractSaturate(shader_integer_functions2,
4483 glsl_type::int_type),
4484 _subtractSaturate(shader_integer_functions2,
4485 glsl_type::ivec2_type),
4486 _subtractSaturate(shader_integer_functions2,
4487 glsl_type::ivec3_type),
4488 _subtractSaturate(shader_integer_functions2,
4489 glsl_type::ivec4_type),
4490 _subtractSaturate(shader_integer_functions2,
4491 glsl_type::uint_type),
4492 _subtractSaturate(shader_integer_functions2,
4493 glsl_type::uvec2_type),
4494 _subtractSaturate(shader_integer_functions2,
4495 glsl_type::uvec3_type),
4496 _subtractSaturate(shader_integer_functions2,
4497 glsl_type::uvec4_type),
4498
4499 _subtractSaturate(shader_integer_functions2_int64,
4500 glsl_type::int64_t_type),
4501 _subtractSaturate(shader_integer_functions2_int64,
4502 glsl_type::i64vec2_type),
4503 _subtractSaturate(shader_integer_functions2_int64,
4504 glsl_type::i64vec3_type),
4505 _subtractSaturate(shader_integer_functions2_int64,
4506 glsl_type::i64vec4_type),
4507 _subtractSaturate(shader_integer_functions2_int64,
4508 glsl_type::uint64_t_type),
4509 _subtractSaturate(shader_integer_functions2_int64,
4510 glsl_type::u64vec2_type),
4511 _subtractSaturate(shader_integer_functions2_int64,
4512 glsl_type::u64vec3_type),
4513 _subtractSaturate(shader_integer_functions2_int64,
4514 glsl_type::u64vec4_type),
4515 NULL);
4516
4517 add_function("multiply32x16",
4518 _multiply32x16(shader_integer_functions2,
4519 glsl_type::int_type),
4520 _multiply32x16(shader_integer_functions2,
4521 glsl_type::ivec2_type),
4522 _multiply32x16(shader_integer_functions2,
4523 glsl_type::ivec3_type),
4524 _multiply32x16(shader_integer_functions2,
4525 glsl_type::ivec4_type),
4526 _multiply32x16(shader_integer_functions2,
4527 glsl_type::uint_type),
4528 _multiply32x16(shader_integer_functions2,
4529 glsl_type::uvec2_type),
4530 _multiply32x16(shader_integer_functions2,
4531 glsl_type::uvec3_type),
4532 _multiply32x16(shader_integer_functions2,
4533 glsl_type::uvec4_type),
4534 NULL);
4535
4536 #undef F
4537 #undef FI
4538 #undef FIUD_VEC
4539 #undef FIUBD_VEC
4540 #undef FIU2_MIXED
4541 }
4542
4543 void
4544 builtin_builder::add_function(const char *name, ...)
4545 {
4546 va_list ap;
4547
4548 ir_function *f = new(mem_ctx) ir_function(name);
4549
4550 va_start(ap, name);
4551 while (true) {
4552 ir_function_signature *sig = va_arg(ap, ir_function_signature *);
4553 if (sig == NULL)
4554 break;
4555
4556 if (false) {
4557 exec_list stuff;
4558 stuff.push_tail(sig);
4559 validate_ir_tree(&stuff);
4560 }
4561
4562 f->add_signature(sig);
4563 }
4564 va_end(ap);
4565
4566 shader->symbols->add_function(f);
4567 }
4568
4569 void
4570 builtin_builder::add_image_function(const char *name,
4571 const char *intrinsic_name,
4572 image_prototype_ctr prototype,
4573 unsigned num_arguments,
4574 unsigned flags,
4575 enum ir_intrinsic_id intrinsic_id)
4576 {
4577 static const glsl_type *const types[] = {
4578 glsl_type::image1D_type,
4579 glsl_type::image2D_type,
4580 glsl_type::image3D_type,
4581 glsl_type::image2DRect_type,
4582 glsl_type::imageCube_type,
4583 glsl_type::imageBuffer_type,
4584 glsl_type::image1DArray_type,
4585 glsl_type::image2DArray_type,
4586 glsl_type::imageCubeArray_type,
4587 glsl_type::image2DMS_type,
4588 glsl_type::image2DMSArray_type,
4589 glsl_type::iimage1D_type,
4590 glsl_type::iimage2D_type,
4591 glsl_type::iimage3D_type,
4592 glsl_type::iimage2DRect_type,
4593 glsl_type::iimageCube_type,
4594 glsl_type::iimageBuffer_type,
4595 glsl_type::iimage1DArray_type,
4596 glsl_type::iimage2DArray_type,
4597 glsl_type::iimageCubeArray_type,
4598 glsl_type::iimage2DMS_type,
4599 glsl_type::iimage2DMSArray_type,
4600 glsl_type::uimage1D_type,
4601 glsl_type::uimage2D_type,
4602 glsl_type::uimage3D_type,
4603 glsl_type::uimage2DRect_type,
4604 glsl_type::uimageCube_type,
4605 glsl_type::uimageBuffer_type,
4606 glsl_type::uimage1DArray_type,
4607 glsl_type::uimage2DArray_type,
4608 glsl_type::uimageCubeArray_type,
4609 glsl_type::uimage2DMS_type,
4610 glsl_type::uimage2DMSArray_type
4611 };
4612
4613 ir_function *f = new(mem_ctx) ir_function(name);
4614
4615 for (unsigned i = 0; i < ARRAY_SIZE(types); ++i) {
4616 if ((types[i]->sampled_type != GLSL_TYPE_FLOAT ||
4617 (flags & IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE)) &&
4618 (types[i]->sampler_dimensionality == GLSL_SAMPLER_DIM_MS ||
4619 !(flags & IMAGE_FUNCTION_MS_ONLY)))
4620 f->add_signature(_image(prototype, types[i], intrinsic_name,
4621 num_arguments, flags, intrinsic_id));
4622 }
4623
4624 shader->symbols->add_function(f);
4625 }
4626
4627 void
4628 builtin_builder::add_image_functions(bool glsl)
4629 {
4630 const unsigned flags = (glsl ? IMAGE_FUNCTION_EMIT_STUB : 0);
4631
4632 add_image_function(glsl ? "imageLoad" : "__intrinsic_image_load",
4633 "__intrinsic_image_load",
4634 &builtin_builder::_image_prototype, 0,
4635 (flags | IMAGE_FUNCTION_HAS_VECTOR_DATA_TYPE |
4636 IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE |
4637 IMAGE_FUNCTION_READ_ONLY),
4638 ir_intrinsic_image_load);
4639
4640 add_image_function(glsl ? "imageStore" : "__intrinsic_image_store",
4641 "__intrinsic_image_store",
4642 &builtin_builder::_image_prototype, 1,
4643 (flags | IMAGE_FUNCTION_RETURNS_VOID |
4644 IMAGE_FUNCTION_HAS_VECTOR_DATA_TYPE |
4645 IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE |
4646 IMAGE_FUNCTION_WRITE_ONLY),
4647 ir_intrinsic_image_store);
4648
4649 const unsigned atom_flags = flags | IMAGE_FUNCTION_AVAIL_ATOMIC;
4650
4651 add_image_function(glsl ? "imageAtomicAdd" : "__intrinsic_image_atomic_add",
4652 "__intrinsic_image_atomic_add",
4653 &builtin_builder::_image_prototype, 1,
4654 (flags | IMAGE_FUNCTION_AVAIL_ATOMIC_ADD |
4655 IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE),
4656 ir_intrinsic_image_atomic_add);
4657
4658 add_image_function(glsl ? "imageAtomicMin" : "__intrinsic_image_atomic_min",
4659 "__intrinsic_image_atomic_min",
4660 &builtin_builder::_image_prototype, 1, atom_flags,
4661 ir_intrinsic_image_atomic_min);
4662
4663 add_image_function(glsl ? "imageAtomicMax" : "__intrinsic_image_atomic_max",
4664 "__intrinsic_image_atomic_max",
4665 &builtin_builder::_image_prototype, 1, atom_flags,
4666 ir_intrinsic_image_atomic_max);
4667
4668 add_image_function(glsl ? "imageAtomicAnd" : "__intrinsic_image_atomic_and",
4669 "__intrinsic_image_atomic_and",
4670 &builtin_builder::_image_prototype, 1, atom_flags,
4671 ir_intrinsic_image_atomic_and);
4672
4673 add_image_function(glsl ? "imageAtomicOr" : "__intrinsic_image_atomic_or",
4674 "__intrinsic_image_atomic_or",
4675 &builtin_builder::_image_prototype, 1, atom_flags,
4676 ir_intrinsic_image_atomic_or);
4677
4678 add_image_function(glsl ? "imageAtomicXor" : "__intrinsic_image_atomic_xor",
4679 "__intrinsic_image_atomic_xor",
4680 &builtin_builder::_image_prototype, 1, atom_flags,
4681 ir_intrinsic_image_atomic_xor);
4682
4683 add_image_function((glsl ? "imageAtomicExchange" :
4684 "__intrinsic_image_atomic_exchange"),
4685 "__intrinsic_image_atomic_exchange",
4686 &builtin_builder::_image_prototype, 1,
4687 (flags | IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE |
4688 IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE),
4689 ir_intrinsic_image_atomic_exchange);
4690
4691 add_image_function((glsl ? "imageAtomicCompSwap" :
4692 "__intrinsic_image_atomic_comp_swap"),
4693 "__intrinsic_image_atomic_comp_swap",
4694 &builtin_builder::_image_prototype, 2, atom_flags,
4695 ir_intrinsic_image_atomic_comp_swap);
4696
4697 add_image_function(glsl ? "imageSize" : "__intrinsic_image_size",
4698 "__intrinsic_image_size",
4699 &builtin_builder::_image_size_prototype, 1,
4700 flags | IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE,
4701 ir_intrinsic_image_size);
4702
4703 add_image_function(glsl ? "imageSamples" : "__intrinsic_image_samples",
4704 "__intrinsic_image_samples",
4705 &builtin_builder::_image_samples_prototype, 1,
4706 flags | IMAGE_FUNCTION_SUPPORTS_FLOAT_DATA_TYPE |
4707 IMAGE_FUNCTION_MS_ONLY,
4708 ir_intrinsic_image_samples);
4709
4710 /* EXT_shader_image_load_store */
4711 add_image_function(glsl ? "imageAtomicIncWrap" : "__intrinsic_image_atomic_inc_wrap",
4712 "__intrinsic_image_atomic_inc_wrap",
4713 &builtin_builder::_image_prototype, 1,
4714 (atom_flags | IMAGE_FUNCTION_EXT_ONLY),
4715 ir_intrinsic_image_atomic_inc_wrap);
4716 add_image_function(glsl ? "imageAtomicDecWrap" : "__intrinsic_image_atomic_dec_wrap",
4717 "__intrinsic_image_atomic_dec_wrap",
4718 &builtin_builder::_image_prototype, 1,
4719 (atom_flags | IMAGE_FUNCTION_EXT_ONLY),
4720 ir_intrinsic_image_atomic_dec_wrap);
4721 }
4722
4723 ir_variable *
4724 builtin_builder::in_var(const glsl_type *type, const char *name)
4725 {
4726 return new(mem_ctx) ir_variable(type, name, ir_var_function_in);
4727 }
4728
4729 ir_variable *
4730 builtin_builder::out_var(const glsl_type *type, const char *name)
4731 {
4732 return new(mem_ctx) ir_variable(type, name, ir_var_function_out);
4733 }
4734
4735 ir_constant *
4736 builtin_builder::imm(bool b, unsigned vector_elements)
4737 {
4738 return new(mem_ctx) ir_constant(b, vector_elements);
4739 }
4740
4741 ir_constant *
4742 builtin_builder::imm(float f, unsigned vector_elements)
4743 {
4744 return new(mem_ctx) ir_constant(f, vector_elements);
4745 }
4746
4747 ir_constant *
4748 builtin_builder::imm(int i, unsigned vector_elements)
4749 {
4750 return new(mem_ctx) ir_constant(i, vector_elements);
4751 }
4752
4753 ir_constant *
4754 builtin_builder::imm(unsigned u, unsigned vector_elements)
4755 {
4756 return new(mem_ctx) ir_constant(u, vector_elements);
4757 }
4758
4759 ir_constant *
4760 builtin_builder::imm(double d, unsigned vector_elements)
4761 {
4762 return new(mem_ctx) ir_constant(d, vector_elements);
4763 }
4764
4765 ir_constant *
4766 builtin_builder::imm(const glsl_type *type, const ir_constant_data &data)
4767 {
4768 return new(mem_ctx) ir_constant(type, &data);
4769 }
4770
4771 #define IMM_FP(type, val) (type->is_double()) ? imm(val) : imm((float)val)
4772
4773 ir_dereference_variable *
4774 builtin_builder::var_ref(ir_variable *var)
4775 {
4776 return new(mem_ctx) ir_dereference_variable(var);
4777 }
4778
4779 ir_dereference_array *
4780 builtin_builder::array_ref(ir_variable *var, int idx)
4781 {
4782 return new(mem_ctx) ir_dereference_array(var, imm(idx));
4783 }
4784
4785 /** Return an element of a matrix */
4786 ir_swizzle *
4787 builtin_builder::matrix_elt(ir_variable *var, int column, int row)
4788 {
4789 return swizzle(array_ref(var, column), row, 1);
4790 }
4791
4792 /**
4793 * Implementations of built-in functions:
4794 * @{
4795 */
4796 ir_function_signature *
4797 builtin_builder::new_sig(const glsl_type *return_type,
4798 builtin_available_predicate avail,
4799 int num_params,
4800 ...)
4801 {
4802 va_list ap;
4803
4804 ir_function_signature *sig =
4805 new(mem_ctx) ir_function_signature(return_type, avail);
4806
4807 exec_list plist;
4808 va_start(ap, num_params);
4809 for (int i = 0; i < num_params; i++) {
4810 plist.push_tail(va_arg(ap, ir_variable *));
4811 }
4812 va_end(ap);
4813
4814 sig->replace_parameters(&plist);
4815 return sig;
4816 }
4817
4818 #define MAKE_SIG(return_type, avail, ...) \
4819 ir_function_signature *sig = \
4820 new_sig(return_type, avail, __VA_ARGS__); \
4821 ir_factory body(&sig->body, mem_ctx); \
4822 sig->is_defined = true;
4823
4824 #define MAKE_INTRINSIC(return_type, id, avail, ...) \
4825 ir_function_signature *sig = \
4826 new_sig(return_type, avail, __VA_ARGS__); \
4827 sig->intrinsic_id = id;
4828
4829 ir_function_signature *
4830 builtin_builder::unop(builtin_available_predicate avail,
4831 ir_expression_operation opcode,
4832 const glsl_type *return_type,
4833 const glsl_type *param_type)
4834 {
4835 ir_variable *x = in_var(param_type, "x");
4836 MAKE_SIG(return_type, avail, 1, x);
4837 body.emit(ret(expr(opcode, x)));
4838 return sig;
4839 }
4840
4841 #define UNOP(NAME, OPCODE, AVAIL) \
4842 ir_function_signature * \
4843 builtin_builder::_##NAME(const glsl_type *type) \
4844 { \
4845 return unop(&AVAIL, OPCODE, type, type); \
4846 }
4847
4848 #define UNOPA(NAME, OPCODE) \
4849 ir_function_signature * \
4850 builtin_builder::_##NAME(builtin_available_predicate avail, const glsl_type *type) \
4851 { \
4852 return unop(avail, OPCODE, type, type); \
4853 }
4854
4855 ir_function_signature *
4856 builtin_builder::binop(builtin_available_predicate avail,
4857 ir_expression_operation opcode,
4858 const glsl_type *return_type,
4859 const glsl_type *param0_type,
4860 const glsl_type *param1_type,
4861 bool swap_operands)
4862 {
4863 ir_variable *x = in_var(param0_type, "x");
4864 ir_variable *y = in_var(param1_type, "y");
4865 MAKE_SIG(return_type, avail, 2, x, y);
4866
4867 if (swap_operands)
4868 body.emit(ret(expr(opcode, y, x)));
4869 else
4870 body.emit(ret(expr(opcode, x, y)));
4871
4872 return sig;
4873 }
4874
4875 #define BINOP(NAME, OPCODE, AVAIL) \
4876 ir_function_signature * \
4877 builtin_builder::_##NAME(const glsl_type *return_type, \
4878 const glsl_type *param0_type, \
4879 const glsl_type *param1_type) \
4880 { \
4881 return binop(&AVAIL, OPCODE, return_type, param0_type, param1_type); \
4882 }
4883
4884 /**
4885 * Angle and Trigonometry Functions @{
4886 */
4887
4888 ir_function_signature *
4889 builtin_builder::_radians(const glsl_type *type)
4890 {
4891 ir_variable *degrees = in_var(type, "degrees");
4892 MAKE_SIG(type, always_available, 1, degrees);
4893 body.emit(ret(mul(degrees, imm(0.0174532925f))));
4894 return sig;
4895 }
4896
4897 ir_function_signature *
4898 builtin_builder::_degrees(const glsl_type *type)
4899 {
4900 ir_variable *radians = in_var(type, "radians");
4901 MAKE_SIG(type, always_available, 1, radians);
4902 body.emit(ret(mul(radians, imm(57.29578f))));
4903 return sig;
4904 }
4905
4906 UNOP(sin, ir_unop_sin, always_available)
4907 UNOP(cos, ir_unop_cos, always_available)
4908
4909 ir_function_signature *
4910 builtin_builder::_tan(const glsl_type *type)
4911 {
4912 ir_variable *theta = in_var(type, "theta");
4913 MAKE_SIG(type, always_available, 1, theta);
4914 body.emit(ret(div(sin(theta), cos(theta))));
4915 return sig;
4916 }
4917
4918 ir_expression *
4919 builtin_builder::asin_expr(ir_variable *x, float p0, float p1)
4920 {
4921 return mul(sign(x),
4922 sub(imm(M_PI_2f),
4923 mul(sqrt(sub(imm(1.0f), abs(x))),
4924 add(imm(M_PI_2f),
4925 mul(abs(x),
4926 add(imm(M_PI_4f - 1.0f),
4927 mul(abs(x),
4928 add(imm(p0),
4929 mul(abs(x), imm(p1))))))))));
4930 }
4931
4932 /**
4933 * Generate a ir_call to a function with a set of parameters
4934 *
4935 * The input \c params can either be a list of \c ir_variable or a list of
4936 * \c ir_dereference_variable. In the latter case, all nodes will be removed
4937 * from \c params and used directly as the parameters to the generated
4938 * \c ir_call.
4939 */
4940 ir_call *
4941 builtin_builder::call(ir_function *f, ir_variable *ret, exec_list params)
4942 {
4943 exec_list actual_params;
4944
4945 foreach_in_list_safe(ir_instruction, ir, &params) {
4946 ir_dereference_variable *d = ir->as_dereference_variable();
4947 if (d != NULL) {
4948 d->remove();
4949 actual_params.push_tail(d);
4950 } else {
4951 ir_variable *var = ir->as_variable();
4952 assert(var != NULL);
4953 actual_params.push_tail(var_ref(var));
4954 }
4955 }
4956
4957 ir_function_signature *sig =
4958 f->exact_matching_signature(NULL, &actual_params);
4959 if (!sig)
4960 return NULL;
4961
4962 ir_dereference_variable *deref =
4963 (sig->return_type->is_void() ? NULL : var_ref(ret));
4964
4965 return new(mem_ctx) ir_call(sig, deref, &actual_params);
4966 }
4967
4968 ir_function_signature *
4969 builtin_builder::_asin(const glsl_type *type)
4970 {
4971 ir_variable *x = in_var(type, "x");
4972 MAKE_SIG(type, always_available, 1, x);
4973
4974 body.emit(ret(asin_expr(x, 0.086566724f, -0.03102955f)));
4975
4976 return sig;
4977 }
4978
4979 ir_function_signature *
4980 builtin_builder::_acos(const glsl_type *type)
4981 {
4982 ir_variable *x = in_var(type, "x");
4983 MAKE_SIG(type, always_available, 1, x);
4984
4985 body.emit(ret(sub(imm(M_PI_2f), asin_expr(x, 0.08132463f, -0.02363318f))));
4986
4987 return sig;
4988 }
4989
4990 ir_function_signature *
4991 builtin_builder::_atan2(const glsl_type *type)
4992 {
4993 const unsigned n = type->vector_elements;
4994 ir_variable *y = in_var(type, "y");
4995 ir_variable *x = in_var(type, "x");
4996 MAKE_SIG(type, is_not_nir, 2, y, x);
4997
4998 /* If we're on the left half-plane rotate the coordinates π/2 clock-wise
4999 * for the y=0 discontinuity to end up aligned with the vertical
5000 * discontinuity of atan(s/t) along t=0. This also makes sure that we
5001 * don't attempt to divide by zero along the vertical line, which may give
5002 * unspecified results on non-GLSL 4.1-capable hardware.
5003 */
5004 ir_variable *flip = body.make_temp(glsl_type::bvec(n), "flip");
5005 body.emit(assign(flip, gequal(imm(0.0f, n), x)));
5006 ir_variable *s = body.make_temp(type, "s");
5007 body.emit(assign(s, csel(flip, abs(x), y)));
5008 ir_variable *t = body.make_temp(type, "t");
5009 body.emit(assign(t, csel(flip, y, abs(x))));
5010
5011 /* If the magnitude of the denominator exceeds some huge value, scale down
5012 * the arguments in order to prevent the reciprocal operation from flushing
5013 * its result to zero, which would cause precision problems, and for s
5014 * infinite would cause us to return a NaN instead of the correct finite
5015 * value.
5016 *
5017 * If fmin and fmax are respectively the smallest and largest positive
5018 * normalized floating point values representable by the implementation,
5019 * the constants below should be in agreement with:
5020 *
5021 * huge <= 1 / fmin
5022 * scale <= 1 / fmin / fmax (for |t| >= huge)
5023 *
5024 * In addition scale should be a negative power of two in order to avoid
5025 * loss of precision. The values chosen below should work for most usual
5026 * floating point representations with at least the dynamic range of ATI's
5027 * 24-bit representation.
5028 */
5029 ir_constant *huge = imm(1e18f, n);
5030 ir_variable *scale = body.make_temp(type, "scale");
5031 body.emit(assign(scale, csel(gequal(abs(t), huge),
5032 imm(0.25f, n), imm(1.0f, n))));
5033 ir_variable *rcp_scaled_t = body.make_temp(type, "rcp_scaled_t");
5034 body.emit(assign(rcp_scaled_t, rcp(mul(t, scale))));
5035 ir_expression *s_over_t = mul(mul(s, scale), rcp_scaled_t);
5036
5037 /* For |x| = |y| assume tan = 1 even if infinite (i.e. pretend momentarily
5038 * that ∞/∞ = 1) in order to comply with the rather artificial rules
5039 * inherited from IEEE 754-2008, namely:
5040 *
5041 * "atan2(±∞, −∞) is ±3π/4
5042 * atan2(±∞, +∞) is ±π/4"
5043 *
5044 * Note that this is inconsistent with the rules for the neighborhood of
5045 * zero that are based on iterated limits:
5046 *
5047 * "atan2(±0, −0) is ±π
5048 * atan2(±0, +0) is ±0"
5049 *
5050 * but GLSL specifically allows implementations to deviate from IEEE rules
5051 * at (0,0), so we take that license (i.e. pretend that 0/0 = 1 here as
5052 * well).
5053 */
5054 ir_expression *tan = csel(equal(abs(x), abs(y)),
5055 imm(1.0f, n), abs(s_over_t));
5056
5057 /* Calculate the arctangent and fix up the result if we had flipped the
5058 * coordinate system.
5059 */
5060 ir_variable *arc = body.make_temp(type, "arc");
5061 do_atan(body, type, arc, tan);
5062 body.emit(assign(arc, add(arc, mul(b2f(flip), imm(M_PI_2f)))));
5063
5064 /* Rather convoluted calculation of the sign of the result. When x < 0 we
5065 * cannot use fsign because we need to be able to distinguish between
5066 * negative and positive zero. Unfortunately we cannot use bitwise
5067 * arithmetic tricks either because of back-ends without integer support.
5068 * When x >= 0 rcp_scaled_t will always be non-negative so this won't be
5069 * able to distinguish between negative and positive zero, but we don't
5070 * care because atan2 is continuous along the whole positive y = 0
5071 * half-line, so it won't affect the result significantly.
5072 */
5073 body.emit(ret(csel(less(min2(y, rcp_scaled_t), imm(0.0f, n)),
5074 neg(arc), arc)));
5075
5076 return sig;
5077 }
5078
5079 void
5080 builtin_builder::do_atan(ir_factory &body, const glsl_type *type, ir_variable *res, operand y_over_x)
5081 {
5082 /*
5083 * range-reduction, first step:
5084 *
5085 * / y_over_x if |y_over_x| <= 1.0;
5086 * x = <
5087 * \ 1.0 / y_over_x otherwise
5088 */
5089 ir_variable *x = body.make_temp(type, "atan_x");
5090 body.emit(assign(x, div(min2(abs(y_over_x),
5091 imm(1.0f)),
5092 max2(abs(y_over_x),
5093 imm(1.0f)))));
5094
5095 /*
5096 * approximate atan by evaluating polynomial:
5097 *
5098 * x * 0.9999793128310355 - x^3 * 0.3326756418091246 +
5099 * x^5 * 0.1938924977115610 - x^7 * 0.1173503194786851 +
5100 * x^9 * 0.0536813784310406 - x^11 * 0.0121323213173444
5101 */
5102 ir_variable *tmp = body.make_temp(type, "atan_tmp");
5103 body.emit(assign(tmp, mul(x, x)));
5104 body.emit(assign(tmp, mul(add(mul(sub(mul(add(mul(sub(mul(add(mul(imm(-0.0121323213173444f),
5105 tmp),
5106 imm(0.0536813784310406f)),
5107 tmp),
5108 imm(0.1173503194786851f)),
5109 tmp),
5110 imm(0.1938924977115610f)),
5111 tmp),
5112 imm(0.3326756418091246f)),
5113 tmp),
5114 imm(0.9999793128310355f)),
5115 x)));
5116
5117 /* range-reduction fixup */
5118 body.emit(assign(tmp, add(tmp,
5119 mul(b2f(greater(abs(y_over_x),
5120 imm(1.0f, type->components()))),
5121 add(mul(tmp,
5122 imm(-2.0f)),
5123 imm(M_PI_2f))))));
5124
5125 /* sign fixup */
5126 body.emit(assign(res, mul(tmp, sign(y_over_x))));
5127 }
5128
5129 ir_function_signature *
5130 builtin_builder::_atan(const glsl_type *type)
5131 {
5132 ir_variable *y_over_x = in_var(type, "y_over_x");
5133 MAKE_SIG(type, is_not_nir, 1, y_over_x);
5134
5135 ir_variable *tmp = body.make_temp(type, "tmp");
5136 do_atan(body, type, tmp, y_over_x);
5137 body.emit(ret(tmp));
5138
5139 return sig;
5140 }
5141
5142 ir_function_signature *
5143 builtin_builder::_sinh(const glsl_type *type)
5144 {
5145 ir_variable *x = in_var(type, "x");
5146 MAKE_SIG(type, v130, 1, x);
5147
5148 /* 0.5 * (e^x - e^(-x)) */
5149 body.emit(ret(mul(imm(0.5f), sub(exp(x), exp(neg(x))))));
5150
5151 return sig;
5152 }
5153
5154 ir_function_signature *
5155 builtin_builder::_cosh(const glsl_type *type)
5156 {
5157 ir_variable *x = in_var(type, "x");
5158 MAKE_SIG(type, v130, 1, x);
5159
5160 /* 0.5 * (e^x + e^(-x)) */
5161 body.emit(ret(mul(imm(0.5f), add(exp(x), exp(neg(x))))));
5162
5163 return sig;
5164 }
5165
5166 ir_function_signature *
5167 builtin_builder::_tanh(const glsl_type *type)
5168 {
5169 ir_variable *x = in_var(type, "x");
5170 MAKE_SIG(type, v130, 1, x);
5171
5172 /* Clamp x to [-10, +10] to avoid precision problems.
5173 * When x > 10, e^(-x) is so small relative to e^x that it gets flushed to
5174 * zero in the computation e^x + e^(-x). The same happens in the other
5175 * direction when x < -10.
5176 */
5177 ir_variable *t = body.make_temp(type, "tmp");
5178 body.emit(assign(t, min2(max2(x, imm(-10.0f)), imm(10.0f))));
5179
5180 /* (e^x - e^(-x)) / (e^x + e^(-x)) */
5181 body.emit(ret(div(sub(exp(t), exp(neg(t))),
5182 add(exp(t), exp(neg(t))))));
5183
5184 return sig;
5185 }
5186
5187 ir_function_signature *
5188 builtin_builder::_asinh(const glsl_type *type)
5189 {
5190 ir_variable *x = in_var(type, "x");
5191 MAKE_SIG(type, v130, 1, x);
5192
5193 body.emit(ret(mul(sign(x), log(add(abs(x), sqrt(add(mul(x, x),
5194 imm(1.0f))))))));
5195 return sig;
5196 }
5197
5198 ir_function_signature *
5199 builtin_builder::_acosh(const glsl_type *type)
5200 {
5201 ir_variable *x = in_var(type, "x");
5202 MAKE_SIG(type, v130, 1, x);
5203
5204 body.emit(ret(log(add(x, sqrt(sub(mul(x, x), imm(1.0f)))))));
5205 return sig;
5206 }
5207
5208 ir_function_signature *
5209 builtin_builder::_atanh(const glsl_type *type)
5210 {
5211 ir_variable *x = in_var(type, "x");
5212 MAKE_SIG(type, v130, 1, x);
5213
5214 body.emit(ret(mul(imm(0.5f), log(div(add(imm(1.0f), x),
5215 sub(imm(1.0f), x))))));
5216 return sig;
5217 }
5218 /** @} */
5219
5220 /**
5221 * Exponential Functions @{
5222 */
5223
5224 ir_function_signature *
5225 builtin_builder::_pow(const glsl_type *type)
5226 {
5227 return binop(always_available, ir_binop_pow, type, type, type);
5228 }
5229
5230 UNOP(exp, ir_unop_exp, always_available)
5231 UNOP(log, ir_unop_log, always_available)
5232 UNOP(exp2, ir_unop_exp2, always_available)
5233 UNOP(log2, ir_unop_log2, always_available)
5234 UNOP(atan_op, ir_unop_atan, is_nir)
5235 UNOPA(sqrt, ir_unop_sqrt)
5236 UNOPA(inversesqrt, ir_unop_rsq)
5237
5238 /** @} */
5239
5240 UNOPA(abs, ir_unop_abs)
5241 UNOPA(sign, ir_unop_sign)
5242 UNOPA(floor, ir_unop_floor)
5243 UNOPA(truncate, ir_unop_trunc)
5244 UNOPA(trunc, ir_unop_trunc)
5245 UNOPA(round, ir_unop_round_even)
5246 UNOPA(roundEven, ir_unop_round_even)
5247 UNOPA(ceil, ir_unop_ceil)
5248 UNOPA(fract, ir_unop_fract)
5249
5250 ir_function_signature *
5251 builtin_builder::_mod(builtin_available_predicate avail,
5252 const glsl_type *x_type, const glsl_type *y_type)
5253 {
5254 return binop(avail, ir_binop_mod, x_type, x_type, y_type);
5255 }
5256
5257 ir_function_signature *
5258 builtin_builder::_modf(builtin_available_predicate avail, const glsl_type *type)
5259 {
5260 ir_variable *x = in_var(type, "x");
5261 ir_variable *i = out_var(type, "i");
5262 MAKE_SIG(type, avail, 2, x, i);
5263
5264 ir_variable *t = body.make_temp(type, "t");
5265 body.emit(assign(t, expr(ir_unop_trunc, x)));
5266 body.emit(assign(i, t));
5267 body.emit(ret(sub(x, t)));
5268
5269 return sig;
5270 }
5271
5272 ir_function_signature *
5273 builtin_builder::_min(builtin_available_predicate avail,
5274 const glsl_type *x_type, const glsl_type *y_type)
5275 {
5276 return binop(avail, ir_binop_min, x_type, x_type, y_type);
5277 }
5278
5279 ir_function_signature *
5280 builtin_builder::_max(builtin_available_predicate avail,
5281 const glsl_type *x_type, const glsl_type *y_type)
5282 {
5283 return binop(avail, ir_binop_max, x_type, x_type, y_type);
5284 }
5285
5286 ir_function_signature *
5287 builtin_builder::_clamp(builtin_available_predicate avail,
5288 const glsl_type *val_type, const glsl_type *bound_type)
5289 {
5290 ir_variable *x = in_var(val_type, "x");
5291 ir_variable *minVal = in_var(bound_type, "minVal");
5292 ir_variable *maxVal = in_var(bound_type, "maxVal");
5293 MAKE_SIG(val_type, avail, 3, x, minVal, maxVal);
5294
5295 body.emit(ret(clamp(x, minVal, maxVal)));
5296
5297 return sig;
5298 }
5299
5300 ir_function_signature *
5301 builtin_builder::_mix_lrp(builtin_available_predicate avail, const glsl_type *val_type, const glsl_type *blend_type)
5302 {
5303 ir_variable *x = in_var(val_type, "x");
5304 ir_variable *y = in_var(val_type, "y");
5305 ir_variable *a = in_var(blend_type, "a");
5306 MAKE_SIG(val_type, avail, 3, x, y, a);
5307
5308 body.emit(ret(lrp(x, y, a)));
5309
5310 return sig;
5311 }
5312
5313 ir_function_signature *
5314 builtin_builder::_mix_sel(builtin_available_predicate avail,
5315 const glsl_type *val_type,
5316 const glsl_type *blend_type)
5317 {
5318 ir_variable *x = in_var(val_type, "x");
5319 ir_variable *y = in_var(val_type, "y");
5320 ir_variable *a = in_var(blend_type, "a");
5321 MAKE_SIG(val_type, avail, 3, x, y, a);
5322
5323 /* csel matches the ternary operator in that a selector of true choses the
5324 * first argument. This differs from mix(x, y, false) which choses the
5325 * second argument (to remain consistent with the interpolating version of
5326 * mix() which takes a blend factor from 0.0 to 1.0 where 0.0 is only x.
5327 *
5328 * To handle the behavior mismatch, reverse the x and y arguments.
5329 */
5330 body.emit(ret(csel(a, y, x)));
5331
5332 return sig;
5333 }
5334
5335 ir_function_signature *
5336 builtin_builder::_step(builtin_available_predicate avail, const glsl_type *edge_type, const glsl_type *x_type)
5337 {
5338 ir_variable *edge = in_var(edge_type, "edge");
5339 ir_variable *x = in_var(x_type, "x");
5340 MAKE_SIG(x_type, avail, 2, edge, x);
5341
5342 ir_variable *t = body.make_temp(x_type, "t");
5343 if (x_type->vector_elements == 1) {
5344 /* Both are floats */
5345 if (edge_type->is_double())
5346 body.emit(assign(t, f2d(b2f(gequal(x, edge)))));
5347 else
5348 body.emit(assign(t, b2f(gequal(x, edge))));
5349 } else if (edge_type->vector_elements == 1) {
5350 /* x is a vector but edge is a float */
5351 for (int i = 0; i < x_type->vector_elements; i++) {
5352 if (edge_type->is_double())
5353 body.emit(assign(t, f2d(b2f(gequal(swizzle(x, i, 1), edge))), 1 << i));
5354 else
5355 body.emit(assign(t, b2f(gequal(swizzle(x, i, 1), edge)), 1 << i));
5356 }
5357 } else {
5358 /* Both are vectors */
5359 for (int i = 0; i < x_type->vector_elements; i++) {
5360 if (edge_type->is_double())
5361 body.emit(assign(t, f2d(b2f(gequal(swizzle(x, i, 1), swizzle(edge, i, 1)))),
5362 1 << i));
5363 else
5364 body.emit(assign(t, b2f(gequal(swizzle(x, i, 1), swizzle(edge, i, 1))),
5365 1 << i));
5366
5367 }
5368 }
5369 body.emit(ret(t));
5370
5371 return sig;
5372 }
5373
5374 ir_function_signature *
5375 builtin_builder::_smoothstep(builtin_available_predicate avail, const glsl_type *edge_type, const glsl_type *x_type)
5376 {
5377 ir_variable *edge0 = in_var(edge_type, "edge0");
5378 ir_variable *edge1 = in_var(edge_type, "edge1");
5379 ir_variable *x = in_var(x_type, "x");
5380 MAKE_SIG(x_type, avail, 3, edge0, edge1, x);
5381
5382 /* From the GLSL 1.10 specification:
5383 *
5384 * genType t;
5385 * t = clamp((x - edge0) / (edge1 - edge0), 0, 1);
5386 * return t * t * (3 - 2 * t);
5387 */
5388
5389 ir_variable *t = body.make_temp(x_type, "t");
5390 body.emit(assign(t, clamp(div(sub(x, edge0), sub(edge1, edge0)),
5391 IMM_FP(x_type, 0.0), IMM_FP(x_type, 1.0))));
5392
5393 body.emit(ret(mul(t, mul(t, sub(IMM_FP(x_type, 3.0), mul(IMM_FP(x_type, 2.0), t))))));
5394
5395 return sig;
5396 }
5397
5398 ir_function_signature *
5399 builtin_builder::_isnan(builtin_available_predicate avail, const glsl_type *type)
5400 {
5401 ir_variable *x = in_var(type, "x");
5402 MAKE_SIG(glsl_type::bvec(type->vector_elements), avail, 1, x);
5403
5404 body.emit(ret(nequal(x, x)));
5405
5406 return sig;
5407 }
5408
5409 ir_function_signature *
5410 builtin_builder::_isinf(builtin_available_predicate avail, const glsl_type *type)
5411 {
5412 ir_variable *x = in_var(type, "x");
5413 MAKE_SIG(glsl_type::bvec(type->vector_elements), avail, 1, x);
5414
5415 ir_constant_data infinities;
5416 for (int i = 0; i < type->vector_elements; i++) {
5417 switch (type->base_type) {
5418 case GLSL_TYPE_FLOAT:
5419 infinities.f[i] = INFINITY;
5420 break;
5421 case GLSL_TYPE_DOUBLE:
5422 infinities.d[i] = INFINITY;
5423 break;
5424 default:
5425 unreachable("unknown type");
5426 }
5427 }
5428
5429 body.emit(ret(equal(abs(x), imm(type, infinities))));
5430
5431 return sig;
5432 }
5433
5434 ir_function_signature *
5435 builtin_builder::_atan2_op(const glsl_type *x_type)
5436 {
5437 return binop(is_nir, ir_binop_atan2, x_type, x_type, x_type);
5438 }
5439
5440 ir_function_signature *
5441 builtin_builder::_floatBitsToInt(const glsl_type *type)
5442 {
5443 ir_variable *x = in_var(type, "x");
5444 MAKE_SIG(glsl_type::ivec(type->vector_elements), shader_bit_encoding, 1, x);
5445 body.emit(ret(bitcast_f2i(x)));
5446 return sig;
5447 }
5448
5449 ir_function_signature *
5450 builtin_builder::_floatBitsToUint(const glsl_type *type)
5451 {
5452 ir_variable *x = in_var(type, "x");
5453 MAKE_SIG(glsl_type::uvec(type->vector_elements), shader_bit_encoding, 1, x);
5454 body.emit(ret(bitcast_f2u(x)));
5455 return sig;
5456 }
5457
5458 ir_function_signature *
5459 builtin_builder::_intBitsToFloat(const glsl_type *type)
5460 {
5461 ir_variable *x = in_var(type, "x");
5462 MAKE_SIG(glsl_type::vec(type->vector_elements), shader_bit_encoding, 1, x);
5463 body.emit(ret(bitcast_i2f(x)));
5464 return sig;
5465 }
5466
5467 ir_function_signature *
5468 builtin_builder::_uintBitsToFloat(const glsl_type *type)
5469 {
5470 ir_variable *x = in_var(type, "x");
5471 MAKE_SIG(glsl_type::vec(type->vector_elements), shader_bit_encoding, 1, x);
5472 body.emit(ret(bitcast_u2f(x)));
5473 return sig;
5474 }
5475
5476 ir_function_signature *
5477 builtin_builder::_doubleBitsToInt64(builtin_available_predicate avail, const glsl_type *type)
5478 {
5479 ir_variable *x = in_var(type, "x");
5480 MAKE_SIG(glsl_type::i64vec(type->vector_elements), avail, 1, x);
5481 body.emit(ret(bitcast_d2i64(x)));
5482 return sig;
5483 }
5484
5485 ir_function_signature *
5486 builtin_builder::_doubleBitsToUint64(builtin_available_predicate avail, const glsl_type *type)
5487 {
5488 ir_variable *x = in_var(type, "x");
5489 MAKE_SIG(glsl_type::u64vec(type->vector_elements), avail, 1, x);
5490 body.emit(ret(bitcast_d2u64(x)));
5491 return sig;
5492 }
5493
5494 ir_function_signature *
5495 builtin_builder::_int64BitsToDouble(builtin_available_predicate avail, const glsl_type *type)
5496 {
5497 ir_variable *x = in_var(type, "x");
5498 MAKE_SIG(glsl_type::dvec(type->vector_elements), avail, 1, x);
5499 body.emit(ret(bitcast_i642d(x)));
5500 return sig;
5501 }
5502
5503 ir_function_signature *
5504 builtin_builder::_uint64BitsToDouble(builtin_available_predicate avail, const glsl_type *type)
5505 {
5506 ir_variable *x = in_var(type, "x");
5507 MAKE_SIG(glsl_type::dvec(type->vector_elements), avail, 1, x);
5508 body.emit(ret(bitcast_u642d(x)));
5509 return sig;
5510 }
5511
5512 ir_function_signature *
5513 builtin_builder::_packUnorm2x16(builtin_available_predicate avail)
5514 {
5515 ir_variable *v = in_var(glsl_type::vec2_type, "v");
5516 MAKE_SIG(glsl_type::uint_type, avail, 1, v);
5517 body.emit(ret(expr(ir_unop_pack_unorm_2x16, v)));
5518 return sig;
5519 }
5520
5521 ir_function_signature *
5522 builtin_builder::_packSnorm2x16(builtin_available_predicate avail)
5523 {
5524 ir_variable *v = in_var(glsl_type::vec2_type, "v");
5525 MAKE_SIG(glsl_type::uint_type, avail, 1, v);
5526 body.emit(ret(expr(ir_unop_pack_snorm_2x16, v)));
5527 return sig;
5528 }
5529
5530 ir_function_signature *
5531 builtin_builder::_packUnorm4x8(builtin_available_predicate avail)
5532 {
5533 ir_variable *v = in_var(glsl_type::vec4_type, "v");
5534 MAKE_SIG(glsl_type::uint_type, avail, 1, v);
5535 body.emit(ret(expr(ir_unop_pack_unorm_4x8, v)));
5536 return sig;
5537 }
5538
5539 ir_function_signature *
5540 builtin_builder::_packSnorm4x8(builtin_available_predicate avail)
5541 {
5542 ir_variable *v = in_var(glsl_type::vec4_type, "v");
5543 MAKE_SIG(glsl_type::uint_type, avail, 1, v);
5544 body.emit(ret(expr(ir_unop_pack_snorm_4x8, v)));
5545 return sig;
5546 }
5547
5548 ir_function_signature *
5549 builtin_builder::_unpackUnorm2x16(builtin_available_predicate avail)
5550 {
5551 ir_variable *p = in_var(glsl_type::uint_type, "p");
5552 MAKE_SIG(glsl_type::vec2_type, avail, 1, p);
5553 body.emit(ret(expr(ir_unop_unpack_unorm_2x16, p)));
5554 return sig;
5555 }
5556
5557 ir_function_signature *
5558 builtin_builder::_unpackSnorm2x16(builtin_available_predicate avail)
5559 {
5560 ir_variable *p = in_var(glsl_type::uint_type, "p");
5561 MAKE_SIG(glsl_type::vec2_type, avail, 1, p);
5562 body.emit(ret(expr(ir_unop_unpack_snorm_2x16, p)));
5563 return sig;
5564 }
5565
5566
5567 ir_function_signature *
5568 builtin_builder::_unpackUnorm4x8(builtin_available_predicate avail)
5569 {
5570 ir_variable *p = in_var(glsl_type::uint_type, "p");
5571 MAKE_SIG(glsl_type::vec4_type, avail, 1, p);
5572 body.emit(ret(expr(ir_unop_unpack_unorm_4x8, p)));
5573 return sig;
5574 }
5575
5576 ir_function_signature *
5577 builtin_builder::_unpackSnorm4x8(builtin_available_predicate avail)
5578 {
5579 ir_variable *p = in_var(glsl_type::uint_type, "p");
5580 MAKE_SIG(glsl_type::vec4_type, avail, 1, p);
5581 body.emit(ret(expr(ir_unop_unpack_snorm_4x8, p)));
5582 return sig;
5583 }
5584
5585 ir_function_signature *
5586 builtin_builder::_packHalf2x16(builtin_available_predicate avail)
5587 {
5588 ir_variable *v = in_var(glsl_type::vec2_type, "v");
5589 MAKE_SIG(glsl_type::uint_type, avail, 1, v);
5590 body.emit(ret(expr(ir_unop_pack_half_2x16, v)));
5591 return sig;
5592 }
5593
5594 ir_function_signature *
5595 builtin_builder::_unpackHalf2x16(builtin_available_predicate avail)
5596 {
5597 ir_variable *p = in_var(glsl_type::uint_type, "p");
5598 MAKE_SIG(glsl_type::vec2_type, avail, 1, p);
5599 body.emit(ret(expr(ir_unop_unpack_half_2x16, p)));
5600 return sig;
5601 }
5602
5603 ir_function_signature *
5604 builtin_builder::_packDouble2x32(builtin_available_predicate avail)
5605 {
5606 ir_variable *v = in_var(glsl_type::uvec2_type, "v");
5607 MAKE_SIG(glsl_type::double_type, avail, 1, v);
5608 body.emit(ret(expr(ir_unop_pack_double_2x32, v)));
5609 return sig;
5610 }
5611
5612 ir_function_signature *
5613 builtin_builder::_unpackDouble2x32(builtin_available_predicate avail)
5614 {
5615 ir_variable *p = in_var(glsl_type::double_type, "p");
5616 MAKE_SIG(glsl_type::uvec2_type, avail, 1, p);
5617 body.emit(ret(expr(ir_unop_unpack_double_2x32, p)));
5618 return sig;
5619 }
5620
5621 ir_function_signature *
5622 builtin_builder::_packInt2x32(builtin_available_predicate avail)
5623 {
5624 ir_variable *v = in_var(glsl_type::ivec2_type, "v");
5625 MAKE_SIG(glsl_type::int64_t_type, avail, 1, v);
5626 body.emit(ret(expr(ir_unop_pack_int_2x32, v)));
5627 return sig;
5628 }
5629
5630 ir_function_signature *
5631 builtin_builder::_unpackInt2x32(builtin_available_predicate avail)
5632 {
5633 ir_variable *p = in_var(glsl_type::int64_t_type, "p");
5634 MAKE_SIG(glsl_type::ivec2_type, avail, 1, p);
5635 body.emit(ret(expr(ir_unop_unpack_int_2x32, p)));
5636 return sig;
5637 }
5638
5639 ir_function_signature *
5640 builtin_builder::_packUint2x32(builtin_available_predicate avail)
5641 {
5642 ir_variable *v = in_var(glsl_type::uvec2_type, "v");
5643 MAKE_SIG(glsl_type::uint64_t_type, avail, 1, v);
5644 body.emit(ret(expr(ir_unop_pack_uint_2x32, v)));
5645 return sig;
5646 }
5647
5648 ir_function_signature *
5649 builtin_builder::_unpackUint2x32(builtin_available_predicate avail)
5650 {
5651 ir_variable *p = in_var(glsl_type::uint64_t_type, "p");
5652 MAKE_SIG(glsl_type::uvec2_type, avail, 1, p);
5653 body.emit(ret(expr(ir_unop_unpack_uint_2x32, p)));
5654 return sig;
5655 }
5656
5657 ir_function_signature *
5658 builtin_builder::_length(builtin_available_predicate avail, const glsl_type *type)
5659 {
5660 ir_variable *x = in_var(type, "x");
5661 MAKE_SIG(type->get_base_type(), avail, 1, x);
5662
5663 body.emit(ret(sqrt(dot(x, x))));
5664
5665 return sig;
5666 }
5667
5668 ir_function_signature *
5669 builtin_builder::_distance(builtin_available_predicate avail, const glsl_type *type)
5670 {
5671 ir_variable *p0 = in_var(type, "p0");
5672 ir_variable *p1 = in_var(type, "p1");
5673 MAKE_SIG(type->get_base_type(), avail, 2, p0, p1);
5674
5675 if (type->vector_elements == 1) {
5676 body.emit(ret(abs(sub(p0, p1))));
5677 } else {
5678 ir_variable *p = body.make_temp(type, "p");
5679 body.emit(assign(p, sub(p0, p1)));
5680 body.emit(ret(sqrt(dot(p, p))));
5681 }
5682
5683 return sig;
5684 }
5685
5686 ir_function_signature *
5687 builtin_builder::_dot(builtin_available_predicate avail, const glsl_type *type)
5688 {
5689 if (type->vector_elements == 1)
5690 return binop(avail, ir_binop_mul, type, type, type);
5691
5692 return binop(avail, ir_binop_dot,
5693 type->get_base_type(), type, type);
5694 }
5695
5696 ir_function_signature *
5697 builtin_builder::_cross(builtin_available_predicate avail, const glsl_type *type)
5698 {
5699 ir_variable *a = in_var(type, "a");
5700 ir_variable *b = in_var(type, "b");
5701 MAKE_SIG(type, avail, 2, a, b);
5702
5703 int yzx = MAKE_SWIZZLE4(SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, 0);
5704 int zxy = MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, 0);
5705
5706 body.emit(ret(sub(mul(swizzle(a, yzx, 3), swizzle(b, zxy, 3)),
5707 mul(swizzle(a, zxy, 3), swizzle(b, yzx, 3)))));
5708
5709 return sig;
5710 }
5711
5712 ir_function_signature *
5713 builtin_builder::_normalize(builtin_available_predicate avail, const glsl_type *type)
5714 {
5715 ir_variable *x = in_var(type, "x");
5716 MAKE_SIG(type, avail, 1, x);
5717
5718 if (type->vector_elements == 1) {
5719 body.emit(ret(sign(x)));
5720 } else {
5721 body.emit(ret(mul(x, rsq(dot(x, x)))));
5722 }
5723
5724 return sig;
5725 }
5726
5727 ir_function_signature *
5728 builtin_builder::_ftransform()
5729 {
5730 MAKE_SIG(glsl_type::vec4_type, compatibility_vs_only, 0);
5731
5732 /* ftransform() refers to global variables, and is always emitted
5733 * directly by ast_function.cpp. Just emit a prototype here so we
5734 * can recognize calls to it.
5735 */
5736 return sig;
5737 }
5738
5739 ir_function_signature *
5740 builtin_builder::_faceforward(builtin_available_predicate avail, const glsl_type *type)
5741 {
5742 ir_variable *N = in_var(type, "N");
5743 ir_variable *I = in_var(type, "I");
5744 ir_variable *Nref = in_var(type, "Nref");
5745 MAKE_SIG(type, avail, 3, N, I, Nref);
5746
5747 body.emit(if_tree(less(dot(Nref, I), IMM_FP(type, 0.0)),
5748 ret(N), ret(neg(N))));
5749
5750 return sig;
5751 }
5752
5753 ir_function_signature *
5754 builtin_builder::_reflect(builtin_available_predicate avail, const glsl_type *type)
5755 {
5756 ir_variable *I = in_var(type, "I");
5757 ir_variable *N = in_var(type, "N");
5758 MAKE_SIG(type, avail, 2, I, N);
5759
5760 /* I - 2 * dot(N, I) * N */
5761 body.emit(ret(sub(I, mul(IMM_FP(type, 2.0), mul(dot(N, I), N)))));
5762
5763 return sig;
5764 }
5765
5766 ir_function_signature *
5767 builtin_builder::_refract(builtin_available_predicate avail, const glsl_type *type)
5768 {
5769 ir_variable *I = in_var(type, "I");
5770 ir_variable *N = in_var(type, "N");
5771 ir_variable *eta = in_var(type->get_base_type(), "eta");
5772 MAKE_SIG(type, avail, 3, I, N, eta);
5773
5774 ir_variable *n_dot_i = body.make_temp(type->get_base_type(), "n_dot_i");
5775 body.emit(assign(n_dot_i, dot(N, I)));
5776
5777 /* From the GLSL 1.10 specification:
5778 * k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I))
5779 * if (k < 0.0)
5780 * return genType(0.0)
5781 * else
5782 * return eta * I - (eta * dot(N, I) + sqrt(k)) * N
5783 */
5784 ir_variable *k = body.make_temp(type->get_base_type(), "k");
5785 body.emit(assign(k, sub(IMM_FP(type, 1.0),
5786 mul(eta, mul(eta, sub(IMM_FP(type, 1.0),
5787 mul(n_dot_i, n_dot_i)))))));
5788 body.emit(if_tree(less(k, IMM_FP(type, 0.0)),
5789 ret(ir_constant::zero(mem_ctx, type)),
5790 ret(sub(mul(eta, I),
5791 mul(add(mul(eta, n_dot_i), sqrt(k)), N)))));
5792
5793 return sig;
5794 }
5795
5796 ir_function_signature *
5797 builtin_builder::_matrixCompMult(builtin_available_predicate avail, const glsl_type *type)
5798 {
5799 ir_variable *x = in_var(type, "x");
5800 ir_variable *y = in_var(type, "y");
5801 MAKE_SIG(type, avail, 2, x, y);
5802
5803 ir_variable *z = body.make_temp(type, "z");
5804 for (int i = 0; i < type->matrix_columns; i++) {
5805 body.emit(assign(array_ref(z, i), mul(array_ref(x, i), array_ref(y, i))));
5806 }
5807 body.emit(ret(z));
5808
5809 return sig;
5810 }
5811
5812 ir_function_signature *
5813 builtin_builder::_outerProduct(builtin_available_predicate avail, const glsl_type *type)
5814 {
5815 ir_variable *c;
5816 ir_variable *r;
5817
5818 if (type->is_double()) {
5819 r = in_var(glsl_type::dvec(type->matrix_columns), "r");
5820 c = in_var(glsl_type::dvec(type->vector_elements), "c");
5821 } else {
5822 r = in_var(glsl_type::vec(type->matrix_columns), "r");
5823 c = in_var(glsl_type::vec(type->vector_elements), "c");
5824 }
5825 MAKE_SIG(type, avail, 2, c, r);
5826
5827 ir_variable *m = body.make_temp(type, "m");
5828 for (int i = 0; i < type->matrix_columns; i++) {
5829 body.emit(assign(array_ref(m, i), mul(c, swizzle(r, i, 1))));
5830 }
5831 body.emit(ret(m));
5832
5833 return sig;
5834 }
5835
5836 ir_function_signature *
5837 builtin_builder::_transpose(builtin_available_predicate avail, const glsl_type *orig_type)
5838 {
5839 const glsl_type *transpose_type =
5840 glsl_type::get_instance(orig_type->base_type,
5841 orig_type->matrix_columns,
5842 orig_type->vector_elements);
5843
5844 ir_variable *m = in_var(orig_type, "m");
5845 MAKE_SIG(transpose_type, avail, 1, m);
5846
5847 ir_variable *t = body.make_temp(transpose_type, "t");
5848 for (int i = 0; i < orig_type->matrix_columns; i++) {
5849 for (int j = 0; j < orig_type->vector_elements; j++) {
5850 body.emit(assign(array_ref(t, j),
5851 matrix_elt(m, i, j),
5852 1 << i));
5853 }
5854 }
5855 body.emit(ret(t));
5856
5857 return sig;
5858 }
5859
5860 ir_function_signature *
5861 builtin_builder::_determinant_mat2(builtin_available_predicate avail, const glsl_type *type)
5862 {
5863 ir_variable *m = in_var(type, "m");
5864 MAKE_SIG(type->get_base_type(), avail, 1, m);
5865
5866 body.emit(ret(sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 1, 1)),
5867 mul(matrix_elt(m, 1, 0), matrix_elt(m, 0, 1)))));
5868
5869 return sig;
5870 }
5871
5872 ir_function_signature *
5873 builtin_builder::_determinant_mat3(builtin_available_predicate avail, const glsl_type *type)
5874 {
5875 ir_variable *m = in_var(type, "m");
5876 MAKE_SIG(type->get_base_type(), avail, 1, m);
5877
5878 ir_expression *f1 =
5879 sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 2)),
5880 mul(matrix_elt(m, 1, 2), matrix_elt(m, 2, 1)));
5881
5882 ir_expression *f2 =
5883 sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 2)),
5884 mul(matrix_elt(m, 1, 2), matrix_elt(m, 2, 0)));
5885
5886 ir_expression *f3 =
5887 sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 1)),
5888 mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 0)));
5889
5890 body.emit(ret(add(sub(mul(matrix_elt(m, 0, 0), f1),
5891 mul(matrix_elt(m, 0, 1), f2)),
5892 mul(matrix_elt(m, 0, 2), f3))));
5893
5894 return sig;
5895 }
5896
5897 ir_function_signature *
5898 builtin_builder::_determinant_mat4(builtin_available_predicate avail, const glsl_type *type)
5899 {
5900 ir_variable *m = in_var(type, "m");
5901 const glsl_type *btype = type->get_base_type();
5902 MAKE_SIG(btype, avail, 1, m);
5903
5904 ir_variable *SubFactor00 = body.make_temp(btype, "SubFactor00");
5905 ir_variable *SubFactor01 = body.make_temp(btype, "SubFactor01");
5906 ir_variable *SubFactor02 = body.make_temp(btype, "SubFactor02");
5907 ir_variable *SubFactor03 = body.make_temp(btype, "SubFactor03");
5908 ir_variable *SubFactor04 = body.make_temp(btype, "SubFactor04");
5909 ir_variable *SubFactor05 = body.make_temp(btype, "SubFactor05");
5910 ir_variable *SubFactor06 = body.make_temp(btype, "SubFactor06");
5911 ir_variable *SubFactor07 = body.make_temp(btype, "SubFactor07");
5912 ir_variable *SubFactor08 = body.make_temp(btype, "SubFactor08");
5913 ir_variable *SubFactor09 = body.make_temp(btype, "SubFactor09");
5914 ir_variable *SubFactor10 = body.make_temp(btype, "SubFactor10");
5915 ir_variable *SubFactor11 = body.make_temp(btype, "SubFactor11");
5916 ir_variable *SubFactor12 = body.make_temp(btype, "SubFactor12");
5917 ir_variable *SubFactor13 = body.make_temp(btype, "SubFactor13");
5918 ir_variable *SubFactor14 = body.make_temp(btype, "SubFactor14");
5919 ir_variable *SubFactor15 = body.make_temp(btype, "SubFactor15");
5920 ir_variable *SubFactor16 = body.make_temp(btype, "SubFactor16");
5921 ir_variable *SubFactor17 = body.make_temp(btype, "SubFactor17");
5922 ir_variable *SubFactor18 = body.make_temp(btype, "SubFactor18");
5923
5924 body.emit(assign(SubFactor00, sub(mul(matrix_elt(m, 2, 2), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 2), matrix_elt(m, 2, 3)))));
5925 body.emit(assign(SubFactor01, sub(mul(matrix_elt(m, 2, 1), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 2, 3)))));
5926 body.emit(assign(SubFactor02, sub(mul(matrix_elt(m, 2, 1), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 2, 2)))));
5927 body.emit(assign(SubFactor03, sub(mul(matrix_elt(m, 2, 0), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 2, 3)))));
5928 body.emit(assign(SubFactor04, sub(mul(matrix_elt(m, 2, 0), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 2, 2)))));
5929 body.emit(assign(SubFactor05, sub(mul(matrix_elt(m, 2, 0), matrix_elt(m, 3, 1)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 2, 1)))));
5930 body.emit(assign(SubFactor06, sub(mul(matrix_elt(m, 1, 2), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 2), matrix_elt(m, 1, 3)))));
5931 body.emit(assign(SubFactor07, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 1, 3)))));
5932 body.emit(assign(SubFactor08, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 1, 2)))));
5933 body.emit(assign(SubFactor09, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 1, 3)))));
5934 body.emit(assign(SubFactor10, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 1, 2)))));
5935 body.emit(assign(SubFactor11, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 1, 3)))));
5936 body.emit(assign(SubFactor12, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 3, 1)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 1, 1)))));
5937 body.emit(assign(SubFactor13, sub(mul(matrix_elt(m, 1, 2), matrix_elt(m, 2, 3)), mul(matrix_elt(m, 2, 2), matrix_elt(m, 1, 3)))));
5938 body.emit(assign(SubFactor14, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 3)), mul(matrix_elt(m, 2, 1), matrix_elt(m, 1, 3)))));
5939 body.emit(assign(SubFactor15, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 2)), mul(matrix_elt(m, 2, 1), matrix_elt(m, 1, 2)))));
5940 body.emit(assign(SubFactor16, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 3)), mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 3)))));
5941 body.emit(assign(SubFactor17, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 2)), mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 2)))));
5942 body.emit(assign(SubFactor18, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 1)), mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 1)))));
5943
5944 ir_variable *adj_0 = body.make_temp(btype == glsl_type::float_type ? glsl_type::vec4_type : glsl_type::dvec4_type, "adj_0");
5945
5946 body.emit(assign(adj_0,
5947 add(sub(mul(matrix_elt(m, 1, 1), SubFactor00),
5948 mul(matrix_elt(m, 1, 2), SubFactor01)),
5949 mul(matrix_elt(m, 1, 3), SubFactor02)),
5950 WRITEMASK_X));
5951 body.emit(assign(adj_0, neg(
5952 add(sub(mul(matrix_elt(m, 1, 0), SubFactor00),
5953 mul(matrix_elt(m, 1, 2), SubFactor03)),
5954 mul(matrix_elt(m, 1, 3), SubFactor04))),
5955 WRITEMASK_Y));
5956 body.emit(assign(adj_0,
5957 add(sub(mul(matrix_elt(m, 1, 0), SubFactor01),
5958 mul(matrix_elt(m, 1, 1), SubFactor03)),
5959 mul(matrix_elt(m, 1, 3), SubFactor05)),
5960 WRITEMASK_Z));
5961 body.emit(assign(adj_0, neg(
5962 add(sub(mul(matrix_elt(m, 1, 0), SubFactor02),
5963 mul(matrix_elt(m, 1, 1), SubFactor04)),
5964 mul(matrix_elt(m, 1, 2), SubFactor05))),
5965 WRITEMASK_W));
5966
5967 body.emit(ret(dot(array_ref(m, 0), adj_0)));
5968
5969 return sig;
5970 }
5971
5972 ir_function_signature *
5973 builtin_builder::_inverse_mat2(builtin_available_predicate avail, const glsl_type *type)
5974 {
5975 ir_variable *m = in_var(type, "m");
5976 MAKE_SIG(type, avail, 1, m);
5977
5978 ir_variable *adj = body.make_temp(type, "adj");
5979 body.emit(assign(array_ref(adj, 0), matrix_elt(m, 1, 1), 1 << 0));
5980 body.emit(assign(array_ref(adj, 0), neg(matrix_elt(m, 0, 1)), 1 << 1));
5981 body.emit(assign(array_ref(adj, 1), neg(matrix_elt(m, 1, 0)), 1 << 0));
5982 body.emit(assign(array_ref(adj, 1), matrix_elt(m, 0, 0), 1 << 1));
5983
5984 ir_expression *det =
5985 sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 1, 1)),
5986 mul(matrix_elt(m, 1, 0), matrix_elt(m, 0, 1)));
5987
5988 body.emit(ret(div(adj, det)));
5989 return sig;
5990 }
5991
5992 ir_function_signature *
5993 builtin_builder::_inverse_mat3(builtin_available_predicate avail, const glsl_type *type)
5994 {
5995 ir_variable *m = in_var(type, "m");
5996 const glsl_type *btype = type->get_base_type();
5997 MAKE_SIG(type, avail, 1, m);
5998
5999 ir_variable *f11_22_21_12 = body.make_temp(btype, "f11_22_21_12");
6000 ir_variable *f10_22_20_12 = body.make_temp(btype, "f10_22_20_12");
6001 ir_variable *f10_21_20_11 = body.make_temp(btype, "f10_21_20_11");
6002
6003 body.emit(assign(f11_22_21_12,
6004 sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 2)),
6005 mul(matrix_elt(m, 2, 1), matrix_elt(m, 1, 2)))));
6006 body.emit(assign(f10_22_20_12,
6007 sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 2)),
6008 mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 2)))));
6009 body.emit(assign(f10_21_20_11,
6010 sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 1)),
6011 mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 1)))));
6012
6013 ir_variable *adj = body.make_temp(type, "adj");
6014 body.emit(assign(array_ref(adj, 0), f11_22_21_12, WRITEMASK_X));
6015 body.emit(assign(array_ref(adj, 1), neg(f10_22_20_12), WRITEMASK_X));
6016 body.emit(assign(array_ref(adj, 2), f10_21_20_11, WRITEMASK_X));
6017
6018 body.emit(assign(array_ref(adj, 0), neg(
6019 sub(mul(matrix_elt(m, 0, 1), matrix_elt(m, 2, 2)),
6020 mul(matrix_elt(m, 2, 1), matrix_elt(m, 0, 2)))),
6021 WRITEMASK_Y));
6022 body.emit(assign(array_ref(adj, 1),
6023 sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 2, 2)),
6024 mul(matrix_elt(m, 2, 0), matrix_elt(m, 0, 2))),
6025 WRITEMASK_Y));
6026 body.emit(assign(array_ref(adj, 2), neg(
6027 sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 2, 1)),
6028 mul(matrix_elt(m, 2, 0), matrix_elt(m, 0, 1)))),
6029 WRITEMASK_Y));
6030
6031 body.emit(assign(array_ref(adj, 0),
6032 sub(mul(matrix_elt(m, 0, 1), matrix_elt(m, 1, 2)),
6033 mul(matrix_elt(m, 1, 1), matrix_elt(m, 0, 2))),
6034 WRITEMASK_Z));
6035 body.emit(assign(array_ref(adj, 1), neg(
6036 sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 1, 2)),
6037 mul(matrix_elt(m, 1, 0), matrix_elt(m, 0, 2)))),
6038 WRITEMASK_Z));
6039 body.emit(assign(array_ref(adj, 2),
6040 sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 1, 1)),
6041 mul(matrix_elt(m, 1, 0), matrix_elt(m, 0, 1))),
6042 WRITEMASK_Z));
6043
6044 ir_expression *det =
6045 add(sub(mul(matrix_elt(m, 0, 0), f11_22_21_12),
6046 mul(matrix_elt(m, 0, 1), f10_22_20_12)),
6047 mul(matrix_elt(m, 0, 2), f10_21_20_11));
6048
6049 body.emit(ret(div(adj, det)));
6050
6051 return sig;
6052 }
6053
6054 ir_function_signature *
6055 builtin_builder::_inverse_mat4(builtin_available_predicate avail, const glsl_type *type)
6056 {
6057 ir_variable *m = in_var(type, "m");
6058 const glsl_type *btype = type->get_base_type();
6059 MAKE_SIG(type, avail, 1, m);
6060
6061 ir_variable *SubFactor00 = body.make_temp(btype, "SubFactor00");
6062 ir_variable *SubFactor01 = body.make_temp(btype, "SubFactor01");
6063 ir_variable *SubFactor02 = body.make_temp(btype, "SubFactor02");
6064 ir_variable *SubFactor03 = body.make_temp(btype, "SubFactor03");
6065 ir_variable *SubFactor04 = body.make_temp(btype, "SubFactor04");
6066 ir_variable *SubFactor05 = body.make_temp(btype, "SubFactor05");
6067 ir_variable *SubFactor06 = body.make_temp(btype, "SubFactor06");
6068 ir_variable *SubFactor07 = body.make_temp(btype, "SubFactor07");
6069 ir_variable *SubFactor08 = body.make_temp(btype, "SubFactor08");
6070 ir_variable *SubFactor09 = body.make_temp(btype, "SubFactor09");
6071 ir_variable *SubFactor10 = body.make_temp(btype, "SubFactor10");
6072 ir_variable *SubFactor11 = body.make_temp(btype, "SubFactor11");
6073 ir_variable *SubFactor12 = body.make_temp(btype, "SubFactor12");
6074 ir_variable *SubFactor13 = body.make_temp(btype, "SubFactor13");
6075 ir_variable *SubFactor14 = body.make_temp(btype, "SubFactor14");
6076 ir_variable *SubFactor15 = body.make_temp(btype, "SubFactor15");
6077 ir_variable *SubFactor16 = body.make_temp(btype, "SubFactor16");
6078 ir_variable *SubFactor17 = body.make_temp(btype, "SubFactor17");
6079 ir_variable *SubFactor18 = body.make_temp(btype, "SubFactor18");
6080
6081 body.emit(assign(SubFactor00, sub(mul(matrix_elt(m, 2, 2), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 2), matrix_elt(m, 2, 3)))));
6082 body.emit(assign(SubFactor01, sub(mul(matrix_elt(m, 2, 1), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 2, 3)))));
6083 body.emit(assign(SubFactor02, sub(mul(matrix_elt(m, 2, 1), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 2, 2)))));
6084 body.emit(assign(SubFactor03, sub(mul(matrix_elt(m, 2, 0), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 2, 3)))));
6085 body.emit(assign(SubFactor04, sub(mul(matrix_elt(m, 2, 0), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 2, 2)))));
6086 body.emit(assign(SubFactor05, sub(mul(matrix_elt(m, 2, 0), matrix_elt(m, 3, 1)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 2, 1)))));
6087 body.emit(assign(SubFactor06, sub(mul(matrix_elt(m, 1, 2), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 2), matrix_elt(m, 1, 3)))));
6088 body.emit(assign(SubFactor07, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 1, 3)))));
6089 body.emit(assign(SubFactor08, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 1, 2)))));
6090 body.emit(assign(SubFactor09, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 1, 3)))));
6091 body.emit(assign(SubFactor10, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 3, 2)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 1, 2)))));
6092 body.emit(assign(SubFactor11, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 3, 3)), mul(matrix_elt(m, 3, 1), matrix_elt(m, 1, 3)))));
6093 body.emit(assign(SubFactor12, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 3, 1)), mul(matrix_elt(m, 3, 0), matrix_elt(m, 1, 1)))));
6094 body.emit(assign(SubFactor13, sub(mul(matrix_elt(m, 1, 2), matrix_elt(m, 2, 3)), mul(matrix_elt(m, 2, 2), matrix_elt(m, 1, 3)))));
6095 body.emit(assign(SubFactor14, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 3)), mul(matrix_elt(m, 2, 1), matrix_elt(m, 1, 3)))));
6096 body.emit(assign(SubFactor15, sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 2)), mul(matrix_elt(m, 2, 1), matrix_elt(m, 1, 2)))));
6097 body.emit(assign(SubFactor16, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 3)), mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 3)))));
6098 body.emit(assign(SubFactor17, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 2)), mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 2)))));
6099 body.emit(assign(SubFactor18, sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 1)), mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 1)))));
6100
6101 ir_variable *adj = body.make_temp(btype == glsl_type::float_type ? glsl_type::mat4_type : glsl_type::dmat4_type, "adj");
6102 body.emit(assign(array_ref(adj, 0),
6103 add(sub(mul(matrix_elt(m, 1, 1), SubFactor00),
6104 mul(matrix_elt(m, 1, 2), SubFactor01)),
6105 mul(matrix_elt(m, 1, 3), SubFactor02)),
6106 WRITEMASK_X));
6107 body.emit(assign(array_ref(adj, 1), neg(
6108 add(sub(mul(matrix_elt(m, 1, 0), SubFactor00),
6109 mul(matrix_elt(m, 1, 2), SubFactor03)),
6110 mul(matrix_elt(m, 1, 3), SubFactor04))),
6111 WRITEMASK_X));
6112 body.emit(assign(array_ref(adj, 2),
6113 add(sub(mul(matrix_elt(m, 1, 0), SubFactor01),
6114 mul(matrix_elt(m, 1, 1), SubFactor03)),
6115 mul(matrix_elt(m, 1, 3), SubFactor05)),
6116 WRITEMASK_X));
6117 body.emit(assign(array_ref(adj, 3), neg(
6118 add(sub(mul(matrix_elt(m, 1, 0), SubFactor02),
6119 mul(matrix_elt(m, 1, 1), SubFactor04)),
6120 mul(matrix_elt(m, 1, 2), SubFactor05))),
6121 WRITEMASK_X));
6122
6123 body.emit(assign(array_ref(adj, 0), neg(
6124 add(sub(mul(matrix_elt(m, 0, 1), SubFactor00),
6125 mul(matrix_elt(m, 0, 2), SubFactor01)),
6126 mul(matrix_elt(m, 0, 3), SubFactor02))),
6127 WRITEMASK_Y));
6128 body.emit(assign(array_ref(adj, 1),
6129 add(sub(mul(matrix_elt(m, 0, 0), SubFactor00),
6130 mul(matrix_elt(m, 0, 2), SubFactor03)),
6131 mul(matrix_elt(m, 0, 3), SubFactor04)),
6132 WRITEMASK_Y));
6133 body.emit(assign(array_ref(adj, 2), neg(
6134 add(sub(mul(matrix_elt(m, 0, 0), SubFactor01),
6135 mul(matrix_elt(m, 0, 1), SubFactor03)),
6136 mul(matrix_elt(m, 0, 3), SubFactor05))),
6137 WRITEMASK_Y));
6138 body.emit(assign(array_ref(adj, 3),
6139 add(sub(mul(matrix_elt(m, 0, 0), SubFactor02),
6140 mul(matrix_elt(m, 0, 1), SubFactor04)),
6141 mul(matrix_elt(m, 0, 2), SubFactor05)),
6142 WRITEMASK_Y));
6143
6144 body.emit(assign(array_ref(adj, 0),
6145 add(sub(mul(matrix_elt(m, 0, 1), SubFactor06),
6146 mul(matrix_elt(m, 0, 2), SubFactor07)),
6147 mul(matrix_elt(m, 0, 3), SubFactor08)),
6148 WRITEMASK_Z));
6149 body.emit(assign(array_ref(adj, 1), neg(
6150 add(sub(mul(matrix_elt(m, 0, 0), SubFactor06),
6151 mul(matrix_elt(m, 0, 2), SubFactor09)),
6152 mul(matrix_elt(m, 0, 3), SubFactor10))),
6153 WRITEMASK_Z));
6154 body.emit(assign(array_ref(adj, 2),
6155 add(sub(mul(matrix_elt(m, 0, 0), SubFactor11),
6156 mul(matrix_elt(m, 0, 1), SubFactor09)),
6157 mul(matrix_elt(m, 0, 3), SubFactor12)),
6158 WRITEMASK_Z));
6159 body.emit(assign(array_ref(adj, 3), neg(
6160 add(sub(mul(matrix_elt(m, 0, 0), SubFactor08),
6161 mul(matrix_elt(m, 0, 1), SubFactor10)),
6162 mul(matrix_elt(m, 0, 2), SubFactor12))),
6163 WRITEMASK_Z));
6164
6165 body.emit(assign(array_ref(adj, 0), neg(
6166 add(sub(mul(matrix_elt(m, 0, 1), SubFactor13),
6167 mul(matrix_elt(m, 0, 2), SubFactor14)),
6168 mul(matrix_elt(m, 0, 3), SubFactor15))),
6169 WRITEMASK_W));
6170 body.emit(assign(array_ref(adj, 1),
6171 add(sub(mul(matrix_elt(m, 0, 0), SubFactor13),
6172 mul(matrix_elt(m, 0, 2), SubFactor16)),
6173 mul(matrix_elt(m, 0, 3), SubFactor17)),
6174 WRITEMASK_W));
6175 body.emit(assign(array_ref(adj, 2), neg(
6176 add(sub(mul(matrix_elt(m, 0, 0), SubFactor14),
6177 mul(matrix_elt(m, 0, 1), SubFactor16)),
6178 mul(matrix_elt(m, 0, 3), SubFactor18))),
6179 WRITEMASK_W));
6180 body.emit(assign(array_ref(adj, 3),
6181 add(sub(mul(matrix_elt(m, 0, 0), SubFactor15),
6182 mul(matrix_elt(m, 0, 1), SubFactor17)),
6183 mul(matrix_elt(m, 0, 2), SubFactor18)),
6184 WRITEMASK_W));
6185
6186 ir_expression *det =
6187 add(mul(matrix_elt(m, 0, 0), matrix_elt(adj, 0, 0)),
6188 add(mul(matrix_elt(m, 0, 1), matrix_elt(adj, 1, 0)),
6189 add(mul(matrix_elt(m, 0, 2), matrix_elt(adj, 2, 0)),
6190 mul(matrix_elt(m, 0, 3), matrix_elt(adj, 3, 0)))));
6191
6192 body.emit(ret(div(adj, det)));
6193
6194 return sig;
6195 }
6196
6197
6198 ir_function_signature *
6199 builtin_builder::_lessThan(builtin_available_predicate avail,
6200 const glsl_type *type)
6201 {
6202 return binop(avail, ir_binop_less,
6203 glsl_type::bvec(type->vector_elements), type, type);
6204 }
6205
6206 ir_function_signature *
6207 builtin_builder::_lessThanEqual(builtin_available_predicate avail,
6208 const glsl_type *type)
6209 {
6210 return binop(avail, ir_binop_gequal,
6211 glsl_type::bvec(type->vector_elements), type, type,
6212 true);
6213 }
6214
6215 ir_function_signature *
6216 builtin_builder::_greaterThan(builtin_available_predicate avail,
6217 const glsl_type *type)
6218 {
6219 return binop(avail, ir_binop_less,
6220 glsl_type::bvec(type->vector_elements), type, type,
6221 true);
6222 }
6223
6224 ir_function_signature *
6225 builtin_builder::_greaterThanEqual(builtin_available_predicate avail,
6226 const glsl_type *type)
6227 {
6228 return binop(avail, ir_binop_gequal,
6229 glsl_type::bvec(type->vector_elements), type, type);
6230 }
6231
6232 ir_function_signature *
6233 builtin_builder::_equal(builtin_available_predicate avail,
6234 const glsl_type *type)
6235 {
6236 return binop(avail, ir_binop_equal,
6237 glsl_type::bvec(type->vector_elements), type, type);
6238 }
6239
6240 ir_function_signature *
6241 builtin_builder::_notEqual(builtin_available_predicate avail,
6242 const glsl_type *type)
6243 {
6244 return binop(avail, ir_binop_nequal,
6245 glsl_type::bvec(type->vector_elements), type, type);
6246 }
6247
6248 ir_function_signature *
6249 builtin_builder::_any(const glsl_type *type)
6250 {
6251 ir_variable *v = in_var(type, "v");
6252 MAKE_SIG(glsl_type::bool_type, always_available, 1, v);
6253
6254 const unsigned vec_elem = v->type->vector_elements;
6255 body.emit(ret(expr(ir_binop_any_nequal, v, imm(false, vec_elem))));
6256
6257 return sig;
6258 }
6259
6260 ir_function_signature *
6261 builtin_builder::_all(const glsl_type *type)
6262 {
6263 ir_variable *v = in_var(type, "v");
6264 MAKE_SIG(glsl_type::bool_type, always_available, 1, v);
6265
6266 const unsigned vec_elem = v->type->vector_elements;
6267 body.emit(ret(expr(ir_binop_all_equal, v, imm(true, vec_elem))));
6268
6269 return sig;
6270 }
6271
6272 UNOP(not, ir_unop_logic_not, always_available)
6273
6274 static bool
6275 has_lod(const glsl_type *sampler_type)
6276 {
6277 assert(sampler_type->is_sampler());
6278
6279 switch (sampler_type->sampler_dimensionality) {
6280 case GLSL_SAMPLER_DIM_RECT:
6281 case GLSL_SAMPLER_DIM_BUF:
6282 case GLSL_SAMPLER_DIM_MS:
6283 return false;
6284 default:
6285 return true;
6286 }
6287 }
6288
6289 ir_function_signature *
6290 builtin_builder::_textureSize(builtin_available_predicate avail,
6291 const glsl_type *return_type,
6292 const glsl_type *sampler_type)
6293 {
6294 ir_variable *s = in_var(sampler_type, "sampler");
6295 /* The sampler always exists; add optional lod later. */
6296 MAKE_SIG(return_type, avail, 1, s);
6297
6298 ir_texture *tex = new(mem_ctx) ir_texture(ir_txs);
6299 tex->set_sampler(new(mem_ctx) ir_dereference_variable(s), return_type);
6300
6301 if (has_lod(sampler_type)) {
6302 ir_variable *lod = in_var(glsl_type::int_type, "lod");
6303 sig->parameters.push_tail(lod);
6304 tex->lod_info.lod = var_ref(lod);
6305 } else {
6306 tex->lod_info.lod = imm(0u);
6307 }
6308
6309 body.emit(ret(tex));
6310
6311 return sig;
6312 }
6313
6314 ir_function_signature *
6315 builtin_builder::_textureSamples(builtin_available_predicate avail,
6316 const glsl_type *sampler_type)
6317 {
6318 ir_variable *s = in_var(sampler_type, "sampler");
6319 MAKE_SIG(glsl_type::int_type, avail, 1, s);
6320
6321 ir_texture *tex = new(mem_ctx) ir_texture(ir_texture_samples);
6322 tex->set_sampler(new(mem_ctx) ir_dereference_variable(s), glsl_type::int_type);
6323 body.emit(ret(tex));
6324
6325 return sig;
6326 }
6327
6328 ir_function_signature *
6329 builtin_builder::_texture(ir_texture_opcode opcode,
6330 builtin_available_predicate avail,
6331 const glsl_type *return_type,
6332 const glsl_type *sampler_type,
6333 const glsl_type *coord_type,
6334 int flags)
6335 {
6336 ir_variable *s = in_var(sampler_type, "sampler");
6337 ir_variable *P = in_var(coord_type, "P");
6338 /* The sampler and coordinate always exist; add optional parameters later. */
6339 MAKE_SIG(return_type, avail, 2, s, P);
6340
6341 ir_texture *tex = new(mem_ctx) ir_texture(opcode);
6342 tex->set_sampler(var_ref(s), return_type);
6343
6344 const int coord_size = sampler_type->coordinate_components();
6345
6346 if (coord_size == coord_type->vector_elements) {
6347 tex->coordinate = var_ref(P);
6348 } else {
6349 /* The incoming coordinate also has the projector or shadow comparator,
6350 * so we need to swizzle those away.
6351 */
6352 tex->coordinate = swizzle_for_size(P, coord_size);
6353 }
6354
6355 /* The projector is always in the last component. */
6356 if (flags & TEX_PROJECT)
6357 tex->projector = swizzle(P, coord_type->vector_elements - 1, 1);
6358
6359 if (sampler_type->sampler_shadow) {
6360 if (opcode == ir_tg4) {
6361 /* gather has refz as a separate parameter, immediately after the
6362 * coordinate
6363 */
6364 ir_variable *refz = in_var(glsl_type::float_type, "refz");
6365 sig->parameters.push_tail(refz);
6366 tex->shadow_comparator = var_ref(refz);
6367 } else {
6368 /* The shadow comparator is normally in the Z component, but a few types
6369 * have sufficiently large coordinates that it's in W.
6370 */
6371 tex->shadow_comparator = swizzle(P, MAX2(coord_size, SWIZZLE_Z), 1);
6372 }
6373 }
6374
6375 if (opcode == ir_txl) {
6376 ir_variable *lod = in_var(glsl_type::float_type, "lod");
6377 sig->parameters.push_tail(lod);
6378 tex->lod_info.lod = var_ref(lod);
6379 } else if (opcode == ir_txd) {
6380 int grad_size = coord_size - (sampler_type->sampler_array ? 1 : 0);
6381 ir_variable *dPdx = in_var(glsl_type::vec(grad_size), "dPdx");
6382 ir_variable *dPdy = in_var(glsl_type::vec(grad_size), "dPdy");
6383 sig->parameters.push_tail(dPdx);
6384 sig->parameters.push_tail(dPdy);
6385 tex->lod_info.grad.dPdx = var_ref(dPdx);
6386 tex->lod_info.grad.dPdy = var_ref(dPdy);
6387 }
6388
6389 if (flags & (TEX_OFFSET | TEX_OFFSET_NONCONST)) {
6390 int offset_size = coord_size - (sampler_type->sampler_array ? 1 : 0);
6391 ir_variable *offset =
6392 new(mem_ctx) ir_variable(glsl_type::ivec(offset_size), "offset",
6393 (flags & TEX_OFFSET) ? ir_var_const_in : ir_var_function_in);
6394 sig->parameters.push_tail(offset);
6395 tex->offset = var_ref(offset);
6396 }
6397
6398 if (flags & TEX_OFFSET_ARRAY) {
6399 ir_variable *offsets =
6400 new(mem_ctx) ir_variable(glsl_type::get_array_instance(glsl_type::ivec2_type, 4),
6401 "offsets", ir_var_const_in);
6402 sig->parameters.push_tail(offsets);
6403 tex->offset = var_ref(offsets);
6404 }
6405
6406 if (opcode == ir_tg4) {
6407 if (flags & TEX_COMPONENT) {
6408 ir_variable *component =
6409 new(mem_ctx) ir_variable(glsl_type::int_type, "comp", ir_var_const_in);
6410 sig->parameters.push_tail(component);
6411 tex->lod_info.component = var_ref(component);
6412 }
6413 else {
6414 tex->lod_info.component = imm(0);
6415 }
6416 }
6417
6418 /* The "bias" parameter comes /after/ the "offset" parameter, which is
6419 * inconsistent with both textureLodOffset and textureGradOffset.
6420 */
6421 if (opcode == ir_txb) {
6422 ir_variable *bias = in_var(glsl_type::float_type, "bias");
6423 sig->parameters.push_tail(bias);
6424 tex->lod_info.bias = var_ref(bias);
6425 }
6426
6427 body.emit(ret(tex));
6428
6429 return sig;
6430 }
6431
6432 ir_function_signature *
6433 builtin_builder::_textureCubeArrayShadow(ir_texture_opcode opcode,
6434 builtin_available_predicate avail,
6435 const glsl_type *sampler_type)
6436 {
6437 ir_variable *s = in_var(sampler_type, "sampler");
6438 ir_variable *P = in_var(glsl_type::vec4_type, "P");
6439 ir_variable *compare = in_var(glsl_type::float_type, "compare");
6440 MAKE_SIG(glsl_type::float_type, avail, 3, s, P, compare);
6441
6442 ir_texture *tex = new(mem_ctx) ir_texture(opcode);
6443 tex->set_sampler(var_ref(s), glsl_type::float_type);
6444
6445 tex->coordinate = var_ref(P);
6446 tex->shadow_comparator = var_ref(compare);
6447
6448 if (opcode == ir_txb) {
6449 ir_variable *bias = in_var(glsl_type::float_type, "bias");
6450 sig->parameters.push_tail(bias);
6451 tex->lod_info.bias = var_ref(bias);
6452 }
6453
6454 if (opcode == ir_txl) {
6455 ir_variable *lod = in_var(glsl_type::float_type, "lod");
6456 sig->parameters.push_tail(lod);
6457 tex->lod_info.lod = var_ref(lod);
6458 }
6459
6460 body.emit(ret(tex));
6461
6462 return sig;
6463 }
6464
6465 ir_function_signature *
6466 builtin_builder::_texelFetch(builtin_available_predicate avail,
6467 const glsl_type *return_type,
6468 const glsl_type *sampler_type,
6469 const glsl_type *coord_type,
6470 const glsl_type *offset_type)
6471 {
6472 ir_variable *s = in_var(sampler_type, "sampler");
6473 ir_variable *P = in_var(coord_type, "P");
6474 /* The sampler and coordinate always exist; add optional parameters later. */
6475 MAKE_SIG(return_type, avail, 2, s, P);
6476
6477 ir_texture *tex = new(mem_ctx) ir_texture(ir_txf);
6478 tex->coordinate = var_ref(P);
6479 tex->set_sampler(var_ref(s), return_type);
6480
6481 if (sampler_type->sampler_dimensionality == GLSL_SAMPLER_DIM_MS) {
6482 ir_variable *sample = in_var(glsl_type::int_type, "sample");
6483 sig->parameters.push_tail(sample);
6484 tex->lod_info.sample_index = var_ref(sample);
6485 tex->op = ir_txf_ms;
6486 } else if (has_lod(sampler_type)) {
6487 ir_variable *lod = in_var(glsl_type::int_type, "lod");
6488 sig->parameters.push_tail(lod);
6489 tex->lod_info.lod = var_ref(lod);
6490 } else {
6491 tex->lod_info.lod = imm(0u);
6492 }
6493
6494 if (offset_type != NULL) {
6495 ir_variable *offset =
6496 new(mem_ctx) ir_variable(offset_type, "offset", ir_var_const_in);
6497 sig->parameters.push_tail(offset);
6498 tex->offset = var_ref(offset);
6499 }
6500
6501 body.emit(ret(tex));
6502
6503 return sig;
6504 }
6505
6506 ir_function_signature *
6507 builtin_builder::_EmitVertex()
6508 {
6509 MAKE_SIG(glsl_type::void_type, gs_only, 0);
6510
6511 ir_rvalue *stream = new(mem_ctx) ir_constant(0, 1);
6512 body.emit(new(mem_ctx) ir_emit_vertex(stream));
6513
6514 return sig;
6515 }
6516
6517 ir_function_signature *
6518 builtin_builder::_EmitStreamVertex(builtin_available_predicate avail,
6519 const glsl_type *stream_type)
6520 {
6521 /* Section 8.12 (Geometry Shader Functions) of the GLSL 4.0 spec says:
6522 *
6523 * "Emit the current values of output variables to the current output
6524 * primitive on stream stream. The argument to stream must be a constant
6525 * integral expression."
6526 */
6527 ir_variable *stream =
6528 new(mem_ctx) ir_variable(stream_type, "stream", ir_var_const_in);
6529
6530 MAKE_SIG(glsl_type::void_type, avail, 1, stream);
6531
6532 body.emit(new(mem_ctx) ir_emit_vertex(var_ref(stream)));
6533
6534 return sig;
6535 }
6536
6537 ir_function_signature *
6538 builtin_builder::_EndPrimitive()
6539 {
6540 MAKE_SIG(glsl_type::void_type, gs_only, 0);
6541
6542 ir_rvalue *stream = new(mem_ctx) ir_constant(0, 1);
6543 body.emit(new(mem_ctx) ir_end_primitive(stream));
6544
6545 return sig;
6546 }
6547
6548 ir_function_signature *
6549 builtin_builder::_EndStreamPrimitive(builtin_available_predicate avail,
6550 const glsl_type *stream_type)
6551 {
6552 /* Section 8.12 (Geometry Shader Functions) of the GLSL 4.0 spec says:
6553 *
6554 * "Completes the current output primitive on stream stream and starts
6555 * a new one. The argument to stream must be a constant integral
6556 * expression."
6557 */
6558 ir_variable *stream =
6559 new(mem_ctx) ir_variable(stream_type, "stream", ir_var_const_in);
6560
6561 MAKE_SIG(glsl_type::void_type, avail, 1, stream);
6562
6563 body.emit(new(mem_ctx) ir_end_primitive(var_ref(stream)));
6564
6565 return sig;
6566 }
6567
6568 ir_function_signature *
6569 builtin_builder::_barrier()
6570 {
6571 MAKE_SIG(glsl_type::void_type, barrier_supported, 0);
6572
6573 body.emit(new(mem_ctx) ir_barrier());
6574 return sig;
6575 }
6576
6577 ir_function_signature *
6578 builtin_builder::_textureQueryLod(builtin_available_predicate avail,
6579 const glsl_type *sampler_type,
6580 const glsl_type *coord_type)
6581 {
6582 ir_variable *s = in_var(sampler_type, "sampler");
6583 ir_variable *coord = in_var(coord_type, "coord");
6584 /* The sampler and coordinate always exist; add optional parameters later. */
6585 MAKE_SIG(glsl_type::vec2_type, avail, 2, s, coord);
6586
6587 ir_texture *tex = new(mem_ctx) ir_texture(ir_lod);
6588 tex->coordinate = var_ref(coord);
6589 tex->set_sampler(var_ref(s), glsl_type::vec2_type);
6590
6591 body.emit(ret(tex));
6592
6593 return sig;
6594 }
6595
6596 ir_function_signature *
6597 builtin_builder::_textureQueryLevels(builtin_available_predicate avail,
6598 const glsl_type *sampler_type)
6599 {
6600 ir_variable *s = in_var(sampler_type, "sampler");
6601 const glsl_type *return_type = glsl_type::int_type;
6602 MAKE_SIG(return_type, avail, 1, s);
6603
6604 ir_texture *tex = new(mem_ctx) ir_texture(ir_query_levels);
6605 tex->set_sampler(var_ref(s), return_type);
6606
6607 body.emit(ret(tex));
6608
6609 return sig;
6610 }
6611
6612 ir_function_signature *
6613 builtin_builder::_textureSamplesIdentical(builtin_available_predicate avail,
6614 const glsl_type *sampler_type,
6615 const glsl_type *coord_type)
6616 {
6617 ir_variable *s = in_var(sampler_type, "sampler");
6618 ir_variable *P = in_var(coord_type, "P");
6619 const glsl_type *return_type = glsl_type::bool_type;
6620 MAKE_SIG(return_type, avail, 2, s, P);
6621
6622 ir_texture *tex = new(mem_ctx) ir_texture(ir_samples_identical);
6623 tex->coordinate = var_ref(P);
6624 tex->set_sampler(var_ref(s), return_type);
6625
6626 body.emit(ret(tex));
6627
6628 return sig;
6629 }
6630
6631 UNOP(dFdx, ir_unop_dFdx, derivatives)
6632 UNOP(dFdxCoarse, ir_unop_dFdx_coarse, derivative_control)
6633 UNOP(dFdxFine, ir_unop_dFdx_fine, derivative_control)
6634 UNOP(dFdy, ir_unop_dFdy, derivatives)
6635 UNOP(dFdyCoarse, ir_unop_dFdy_coarse, derivative_control)
6636 UNOP(dFdyFine, ir_unop_dFdy_fine, derivative_control)
6637
6638 ir_function_signature *
6639 builtin_builder::_fwidth(const glsl_type *type)
6640 {
6641 ir_variable *p = in_var(type, "p");
6642 MAKE_SIG(type, derivatives, 1, p);
6643
6644 body.emit(ret(add(abs(expr(ir_unop_dFdx, p)), abs(expr(ir_unop_dFdy, p)))));
6645
6646 return sig;
6647 }
6648
6649 ir_function_signature *
6650 builtin_builder::_fwidthCoarse(const glsl_type *type)
6651 {
6652 ir_variable *p = in_var(type, "p");
6653 MAKE_SIG(type, derivative_control, 1, p);
6654
6655 body.emit(ret(add(abs(expr(ir_unop_dFdx_coarse, p)),
6656 abs(expr(ir_unop_dFdy_coarse, p)))));
6657
6658 return sig;
6659 }
6660
6661 ir_function_signature *
6662 builtin_builder::_fwidthFine(const glsl_type *type)
6663 {
6664 ir_variable *p = in_var(type, "p");
6665 MAKE_SIG(type, derivative_control, 1, p);
6666
6667 body.emit(ret(add(abs(expr(ir_unop_dFdx_fine, p)),
6668 abs(expr(ir_unop_dFdy_fine, p)))));
6669
6670 return sig;
6671 }
6672
6673 ir_function_signature *
6674 builtin_builder::_noise1(const glsl_type *type)
6675 {
6676 /* From the GLSL 4.60 specification:
6677 *
6678 * "The noise functions noise1, noise2, noise3, and noise4 have been
6679 * deprecated starting with version 4.4 of GLSL. When not generating
6680 * SPIR-V they are defined to return the value 0.0 or a vector whose
6681 * components are all 0.0. When generating SPIR-V the noise functions
6682 * are not declared and may not be used."
6683 *
6684 * In earlier versions of the GLSL specification attempt to define some
6685 * sort of statistical noise function. However, the function's
6686 * characteristics have always been such that always returning 0 is
6687 * valid and Mesa has always returned 0 for noise on most drivers.
6688 */
6689 ir_variable *p = in_var(type, "p");
6690 MAKE_SIG(glsl_type::float_type, v110, 1, p);
6691 body.emit(ret(imm(glsl_type::float_type, ir_constant_data())));
6692 return sig;
6693 }
6694
6695 ir_function_signature *
6696 builtin_builder::_noise2(const glsl_type *type)
6697 {
6698 /* See builtin_builder::_noise1 */
6699 ir_variable *p = in_var(type, "p");
6700 MAKE_SIG(glsl_type::vec2_type, v110, 1, p);
6701 body.emit(ret(imm(glsl_type::vec2_type, ir_constant_data())));
6702 return sig;
6703 }
6704
6705 ir_function_signature *
6706 builtin_builder::_noise3(const glsl_type *type)
6707 {
6708 /* See builtin_builder::_noise1 */
6709 ir_variable *p = in_var(type, "p");
6710 MAKE_SIG(glsl_type::vec3_type, v110, 1, p);
6711 body.emit(ret(imm(glsl_type::vec3_type, ir_constant_data())));
6712 return sig;
6713 }
6714
6715 ir_function_signature *
6716 builtin_builder::_noise4(const glsl_type *type)
6717 {
6718 /* See builtin_builder::_noise1 */
6719 ir_variable *p = in_var(type, "p");
6720 MAKE_SIG(glsl_type::vec4_type, v110, 1, p);
6721 body.emit(ret(imm(glsl_type::vec4_type, ir_constant_data())));
6722 return sig;
6723 }
6724
6725 ir_function_signature *
6726 builtin_builder::_bitfieldExtract(const glsl_type *type)
6727 {
6728 bool is_uint = type->base_type == GLSL_TYPE_UINT;
6729 ir_variable *value = in_var(type, "value");
6730 ir_variable *offset = in_var(glsl_type::int_type, "offset");
6731 ir_variable *bits = in_var(glsl_type::int_type, "bits");
6732 MAKE_SIG(type, gpu_shader5_or_es31_or_integer_functions, 3, value, offset,
6733 bits);
6734
6735 operand cast_offset = is_uint ? i2u(offset) : operand(offset);
6736 operand cast_bits = is_uint ? i2u(bits) : operand(bits);
6737
6738 body.emit(ret(expr(ir_triop_bitfield_extract, value,
6739 swizzle(cast_offset, SWIZZLE_XXXX, type->vector_elements),
6740 swizzle(cast_bits, SWIZZLE_XXXX, type->vector_elements))));
6741
6742 return sig;
6743 }
6744
6745 ir_function_signature *
6746 builtin_builder::_bitfieldInsert(const glsl_type *type)
6747 {
6748 bool is_uint = type->base_type == GLSL_TYPE_UINT;
6749 ir_variable *base = in_var(type, "base");
6750 ir_variable *insert = in_var(type, "insert");
6751 ir_variable *offset = in_var(glsl_type::int_type, "offset");
6752 ir_variable *bits = in_var(glsl_type::int_type, "bits");
6753 MAKE_SIG(type, gpu_shader5_or_es31_or_integer_functions, 4, base, insert,
6754 offset, bits);
6755
6756 operand cast_offset = is_uint ? i2u(offset) : operand(offset);
6757 operand cast_bits = is_uint ? i2u(bits) : operand(bits);
6758
6759 body.emit(ret(bitfield_insert(base, insert,
6760 swizzle(cast_offset, SWIZZLE_XXXX, type->vector_elements),
6761 swizzle(cast_bits, SWIZZLE_XXXX, type->vector_elements))));
6762
6763 return sig;
6764 }
6765
6766 UNOP(bitfieldReverse, ir_unop_bitfield_reverse, gpu_shader5_or_es31_or_integer_functions)
6767
6768 ir_function_signature *
6769 builtin_builder::_bitCount(const glsl_type *type)
6770 {
6771 return unop(gpu_shader5_or_es31_or_integer_functions, ir_unop_bit_count,
6772 glsl_type::ivec(type->vector_elements), type);
6773 }
6774
6775 ir_function_signature *
6776 builtin_builder::_findLSB(const glsl_type *type)
6777 {
6778 return unop(gpu_shader5_or_es31_or_integer_functions, ir_unop_find_lsb,
6779 glsl_type::ivec(type->vector_elements), type);
6780 }
6781
6782 ir_function_signature *
6783 builtin_builder::_findMSB(const glsl_type *type)
6784 {
6785 return unop(gpu_shader5_or_es31_or_integer_functions, ir_unop_find_msb,
6786 glsl_type::ivec(type->vector_elements), type);
6787 }
6788
6789 ir_function_signature *
6790 builtin_builder::_countLeadingZeros(builtin_available_predicate avail,
6791 const glsl_type *type)
6792 {
6793 return unop(avail, ir_unop_clz,
6794 glsl_type::uvec(type->vector_elements), type);
6795 }
6796
6797 ir_function_signature *
6798 builtin_builder::_countTrailingZeros(builtin_available_predicate avail,
6799 const glsl_type *type)
6800 {
6801 ir_variable *a = in_var(type, "a");
6802 MAKE_SIG(glsl_type::uvec(type->vector_elements), avail, 1, a);
6803
6804 body.emit(ret(ir_builder::min2(
6805 ir_builder::i2u(ir_builder::expr(ir_unop_find_lsb, a)),
6806 imm(32u))));
6807
6808 return sig;
6809 }
6810
6811 ir_function_signature *
6812 builtin_builder::_fma(builtin_available_predicate avail, const glsl_type *type)
6813 {
6814 ir_variable *a = in_var(type, "a");
6815 ir_variable *b = in_var(type, "b");
6816 ir_variable *c = in_var(type, "c");
6817 MAKE_SIG(type, avail, 3, a, b, c);
6818
6819 body.emit(ret(ir_builder::fma(a, b, c)));
6820
6821 return sig;
6822 }
6823
6824 ir_function_signature *
6825 builtin_builder::_ldexp(const glsl_type *x_type, const glsl_type *exp_type)
6826 {
6827 return binop(x_type->is_double() ? fp64 : gpu_shader5_or_es31_or_integer_functions,
6828 ir_binop_ldexp, x_type, x_type, exp_type);
6829 }
6830
6831 ir_function_signature *
6832 builtin_builder::_dfrexp(const glsl_type *x_type, const glsl_type *exp_type)
6833 {
6834 ir_variable *x = in_var(x_type, "x");
6835 ir_variable *exponent = out_var(exp_type, "exp");
6836 MAKE_SIG(x_type, fp64, 2, x, exponent);
6837
6838 body.emit(assign(exponent, expr(ir_unop_frexp_exp, x)));
6839
6840 body.emit(ret(expr(ir_unop_frexp_sig, x)));
6841 return sig;
6842 }
6843
6844 ir_function_signature *
6845 builtin_builder::_frexp(const glsl_type *x_type, const glsl_type *exp_type)
6846 {
6847 ir_variable *x = in_var(x_type, "x");
6848 ir_variable *exponent = out_var(exp_type, "exp");
6849 MAKE_SIG(x_type, gpu_shader5_or_es31_or_integer_functions, 2, x, exponent);
6850
6851 const unsigned vec_elem = x_type->vector_elements;
6852 const glsl_type *bvec = glsl_type::get_instance(GLSL_TYPE_BOOL, vec_elem, 1);
6853 const glsl_type *uvec = glsl_type::get_instance(GLSL_TYPE_UINT, vec_elem, 1);
6854
6855 /* Single-precision floating-point values are stored as
6856 * 1 sign bit;
6857 * 8 exponent bits;
6858 * 23 mantissa bits.
6859 *
6860 * An exponent shift of 23 will shift the mantissa out, leaving only the
6861 * exponent and sign bit (which itself may be zero, if the absolute value
6862 * was taken before the bitcast and shift.
6863 */
6864 ir_constant *exponent_shift = imm(23);
6865 ir_constant *exponent_bias = imm(-126, vec_elem);
6866
6867 ir_constant *sign_mantissa_mask = imm(0x807fffffu, vec_elem);
6868
6869 /* Exponent of floating-point values in the range [0.5, 1.0). */
6870 ir_constant *exponent_value = imm(0x3f000000u, vec_elem);
6871
6872 ir_variable *is_not_zero = body.make_temp(bvec, "is_not_zero");
6873 body.emit(assign(is_not_zero, nequal(abs(x), imm(0.0f, vec_elem))));
6874
6875 /* Since abs(x) ensures that the sign bit is zero, we don't need to bitcast
6876 * to unsigned integers to ensure that 1 bits aren't shifted in.
6877 */
6878 body.emit(assign(exponent, rshift(bitcast_f2i(abs(x)), exponent_shift)));
6879 body.emit(assign(exponent, add(exponent, csel(is_not_zero, exponent_bias,
6880 imm(0, vec_elem)))));
6881
6882 ir_variable *bits = body.make_temp(uvec, "bits");
6883 body.emit(assign(bits, bitcast_f2u(x)));
6884 body.emit(assign(bits, bit_and(bits, sign_mantissa_mask)));
6885 body.emit(assign(bits, bit_or(bits, csel(is_not_zero, exponent_value,
6886 imm(0u, vec_elem)))));
6887 body.emit(ret(bitcast_u2f(bits)));
6888
6889 return sig;
6890 }
6891
6892 ir_function_signature *
6893 builtin_builder::_uaddCarry(const glsl_type *type)
6894 {
6895 ir_variable *x = in_var(type, "x");
6896 ir_variable *y = in_var(type, "y");
6897 ir_variable *carry = out_var(type, "carry");
6898 MAKE_SIG(type, gpu_shader5_or_es31_or_integer_functions, 3, x, y, carry);
6899
6900 body.emit(assign(carry, ir_builder::carry(x, y)));
6901 body.emit(ret(add(x, y)));
6902
6903 return sig;
6904 }
6905
6906 ir_function_signature *
6907 builtin_builder::_addSaturate(builtin_available_predicate avail,
6908 const glsl_type *type)
6909 {
6910 return binop(avail, ir_binop_add_sat, type, type, type);
6911 }
6912
6913 ir_function_signature *
6914 builtin_builder::_usubBorrow(const glsl_type *type)
6915 {
6916 ir_variable *x = in_var(type, "x");
6917 ir_variable *y = in_var(type, "y");
6918 ir_variable *borrow = out_var(type, "borrow");
6919 MAKE_SIG(type, gpu_shader5_or_es31_or_integer_functions, 3, x, y, borrow);
6920
6921 body.emit(assign(borrow, ir_builder::borrow(x, y)));
6922 body.emit(ret(sub(x, y)));
6923
6924 return sig;
6925 }
6926
6927 ir_function_signature *
6928 builtin_builder::_subtractSaturate(builtin_available_predicate avail,
6929 const glsl_type *type)
6930 {
6931 return binop(avail, ir_binop_sub_sat, type, type, type);
6932 }
6933
6934 ir_function_signature *
6935 builtin_builder::_absoluteDifference(builtin_available_predicate avail,
6936 const glsl_type *type)
6937 {
6938 /* absoluteDifference returns an unsigned type that has the same number of
6939 * bits and number of vector elements as the type of the operands.
6940 */
6941 return binop(avail, ir_binop_abs_sub,
6942 glsl_type::get_instance(glsl_unsigned_base_type_of(type->base_type),
6943 type->vector_elements, 1),
6944 type, type);
6945 }
6946
6947 ir_function_signature *
6948 builtin_builder::_average(builtin_available_predicate avail,
6949 const glsl_type *type)
6950 {
6951 return binop(avail, ir_binop_avg, type, type, type);
6952 }
6953
6954 ir_function_signature *
6955 builtin_builder::_averageRounded(builtin_available_predicate avail,
6956 const glsl_type *type)
6957 {
6958 return binop(avail, ir_binop_avg_round, type, type, type);
6959 }
6960
6961 /**
6962 * For both imulExtended() and umulExtended() built-ins.
6963 */
6964 ir_function_signature *
6965 builtin_builder::_mulExtended(const glsl_type *type)
6966 {
6967 const glsl_type *mul_type, *unpack_type;
6968 ir_expression_operation unpack_op;
6969
6970 if (type->base_type == GLSL_TYPE_INT) {
6971 unpack_op = ir_unop_unpack_int_2x32;
6972 mul_type = glsl_type::get_instance(GLSL_TYPE_INT64, type->vector_elements, 1);
6973 unpack_type = glsl_type::ivec2_type;
6974 } else {
6975 unpack_op = ir_unop_unpack_uint_2x32;
6976 mul_type = glsl_type::get_instance(GLSL_TYPE_UINT64, type->vector_elements, 1);
6977 unpack_type = glsl_type::uvec2_type;
6978 }
6979
6980 ir_variable *x = in_var(type, "x");
6981 ir_variable *y = in_var(type, "y");
6982 ir_variable *msb = out_var(type, "msb");
6983 ir_variable *lsb = out_var(type, "lsb");
6984 MAKE_SIG(glsl_type::void_type, gpu_shader5_or_es31_or_integer_functions, 4, x, y, msb, lsb);
6985
6986 ir_variable *unpack_val = body.make_temp(unpack_type, "_unpack_val");
6987
6988 ir_expression *mul_res = new(mem_ctx) ir_expression(ir_binop_mul, mul_type,
6989 new(mem_ctx)ir_dereference_variable(x),
6990 new(mem_ctx)ir_dereference_variable(y));
6991
6992 if (type->vector_elements == 1) {
6993 body.emit(assign(unpack_val, expr(unpack_op, mul_res)));
6994 body.emit(assign(msb, swizzle_y(unpack_val)));
6995 body.emit(assign(lsb, swizzle_x(unpack_val)));
6996 } else {
6997 for (int i = 0; i < type->vector_elements; i++) {
6998 body.emit(assign(unpack_val, expr(unpack_op, swizzle(mul_res, i, 1))));
6999 body.emit(assign(array_ref(msb, i), swizzle_y(unpack_val)));
7000 body.emit(assign(array_ref(lsb, i), swizzle_x(unpack_val)));
7001 }
7002 }
7003
7004 return sig;
7005 }
7006
7007 ir_function_signature *
7008 builtin_builder::_multiply32x16(builtin_available_predicate avail,
7009 const glsl_type *type)
7010 {
7011 return binop(avail, ir_binop_mul_32x16, type, type, type);
7012 }
7013
7014 ir_function_signature *
7015 builtin_builder::_interpolateAtCentroid(const glsl_type *type)
7016 {
7017 ir_variable *interpolant = in_var(type, "interpolant");
7018 interpolant->data.must_be_shader_input = 1;
7019 MAKE_SIG(type, fs_interpolate_at, 1, interpolant);
7020
7021 body.emit(ret(interpolate_at_centroid(interpolant)));
7022
7023 return sig;
7024 }
7025
7026 ir_function_signature *
7027 builtin_builder::_interpolateAtOffset(const glsl_type *type)
7028 {
7029 ir_variable *interpolant = in_var(type, "interpolant");
7030 interpolant->data.must_be_shader_input = 1;
7031 ir_variable *offset = in_var(glsl_type::vec2_type, "offset");
7032 MAKE_SIG(type, fs_interpolate_at, 2, interpolant, offset);
7033
7034 body.emit(ret(interpolate_at_offset(interpolant, offset)));
7035
7036 return sig;
7037 }
7038
7039 ir_function_signature *
7040 builtin_builder::_interpolateAtSample(const glsl_type *type)
7041 {
7042 ir_variable *interpolant = in_var(type, "interpolant");
7043 interpolant->data.must_be_shader_input = 1;
7044 ir_variable *sample_num = in_var(glsl_type::int_type, "sample_num");
7045 MAKE_SIG(type, fs_interpolate_at, 2, interpolant, sample_num);
7046
7047 body.emit(ret(interpolate_at_sample(interpolant, sample_num)));
7048
7049 return sig;
7050 }
7051
7052 ir_function_signature *
7053 builtin_builder::_atomic_counter_intrinsic(builtin_available_predicate avail,
7054 enum ir_intrinsic_id id)
7055 {
7056 ir_variable *counter = in_var(glsl_type::atomic_uint_type, "counter");
7057 MAKE_INTRINSIC(glsl_type::uint_type, id, avail, 1, counter);
7058 return sig;
7059 }
7060
7061 ir_function_signature *
7062 builtin_builder::_atomic_counter_intrinsic1(builtin_available_predicate avail,
7063 enum ir_intrinsic_id id)
7064 {
7065 ir_variable *counter = in_var(glsl_type::atomic_uint_type, "counter");
7066 ir_variable *data = in_var(glsl_type::uint_type, "data");
7067 MAKE_INTRINSIC(glsl_type::uint_type, id, avail, 2, counter, data);
7068 return sig;
7069 }
7070
7071 ir_function_signature *
7072 builtin_builder::_atomic_counter_intrinsic2(builtin_available_predicate avail,
7073 enum ir_intrinsic_id id)
7074 {
7075 ir_variable *counter = in_var(glsl_type::atomic_uint_type, "counter");
7076 ir_variable *compare = in_var(glsl_type::uint_type, "compare");
7077 ir_variable *data = in_var(glsl_type::uint_type, "data");
7078 MAKE_INTRINSIC(glsl_type::uint_type, id, avail, 3, counter, compare, data);
7079 return sig;
7080 }
7081
7082 ir_function_signature *
7083 builtin_builder::_atomic_intrinsic2(builtin_available_predicate avail,
7084 const glsl_type *type,
7085 enum ir_intrinsic_id id)
7086 {
7087 ir_variable *atomic = in_var(type, "atomic");
7088 ir_variable *data = in_var(type, "data");
7089 MAKE_INTRINSIC(type, id, avail, 2, atomic, data);
7090 return sig;
7091 }
7092
7093 ir_function_signature *
7094 builtin_builder::_atomic_intrinsic3(builtin_available_predicate avail,
7095 const glsl_type *type,
7096 enum ir_intrinsic_id id)
7097 {
7098 ir_variable *atomic = in_var(type, "atomic");
7099 ir_variable *data1 = in_var(type, "data1");
7100 ir_variable *data2 = in_var(type, "data2");
7101 MAKE_INTRINSIC(type, id, avail, 3, atomic, data1, data2);
7102 return sig;
7103 }
7104
7105 ir_function_signature *
7106 builtin_builder::_atomic_counter_op(const char *intrinsic,
7107 builtin_available_predicate avail)
7108 {
7109 ir_variable *counter = in_var(glsl_type::atomic_uint_type, "atomic_counter");
7110 MAKE_SIG(glsl_type::uint_type, avail, 1, counter);
7111
7112 ir_variable *retval = body.make_temp(glsl_type::uint_type, "atomic_retval");
7113 body.emit(call(shader->symbols->get_function(intrinsic), retval,
7114 sig->parameters));
7115 body.emit(ret(retval));
7116 return sig;
7117 }
7118
7119 ir_function_signature *
7120 builtin_builder::_atomic_counter_op1(const char *intrinsic,
7121 builtin_available_predicate avail)
7122 {
7123 ir_variable *counter = in_var(glsl_type::atomic_uint_type, "atomic_counter");
7124 ir_variable *data = in_var(glsl_type::uint_type, "data");
7125 MAKE_SIG(glsl_type::uint_type, avail, 2, counter, data);
7126
7127 ir_variable *retval = body.make_temp(glsl_type::uint_type, "atomic_retval");
7128
7129 /* Instead of generating an __intrinsic_atomic_sub, generate an
7130 * __intrinsic_atomic_add with the data parameter negated.
7131 */
7132 if (strcmp("__intrinsic_atomic_sub", intrinsic) == 0) {
7133 ir_variable *const neg_data =
7134 body.make_temp(glsl_type::uint_type, "neg_data");
7135
7136 body.emit(assign(neg_data, neg(data)));
7137
7138 exec_list parameters;
7139
7140 parameters.push_tail(new(mem_ctx) ir_dereference_variable(counter));
7141 parameters.push_tail(new(mem_ctx) ir_dereference_variable(neg_data));
7142
7143 ir_function *const func =
7144 shader->symbols->get_function("__intrinsic_atomic_add");
7145 ir_instruction *const c = call(func, retval, parameters);
7146
7147 assert(c != NULL);
7148 assert(parameters.is_empty());
7149
7150 body.emit(c);
7151 } else {
7152 body.emit(call(shader->symbols->get_function(intrinsic), retval,
7153 sig->parameters));
7154 }
7155
7156 body.emit(ret(retval));
7157 return sig;
7158 }
7159
7160 ir_function_signature *
7161 builtin_builder::_atomic_counter_op2(const char *intrinsic,
7162 builtin_available_predicate avail)
7163 {
7164 ir_variable *counter = in_var(glsl_type::atomic_uint_type, "atomic_counter");
7165 ir_variable *compare = in_var(glsl_type::uint_type, "compare");
7166 ir_variable *data = in_var(glsl_type::uint_type, "data");
7167 MAKE_SIG(glsl_type::uint_type, avail, 3, counter, compare, data);
7168
7169 ir_variable *retval = body.make_temp(glsl_type::uint_type, "atomic_retval");
7170 body.emit(call(shader->symbols->get_function(intrinsic), retval,
7171 sig->parameters));
7172 body.emit(ret(retval));
7173 return sig;
7174 }
7175
7176 ir_function_signature *
7177 builtin_builder::_atomic_op2(const char *intrinsic,
7178 builtin_available_predicate avail,
7179 const glsl_type *type)
7180 {
7181 ir_variable *atomic = in_var(type, "atomic_var");
7182 ir_variable *data = in_var(type, "atomic_data");
7183 MAKE_SIG(type, avail, 2, atomic, data);
7184
7185 ir_variable *retval = body.make_temp(type, "atomic_retval");
7186 body.emit(call(shader->symbols->get_function(intrinsic), retval,
7187 sig->parameters));
7188 body.emit(ret(retval));
7189 return sig;
7190 }
7191
7192 ir_function_signature *
7193 builtin_builder::_atomic_op3(const char *intrinsic,
7194 builtin_available_predicate avail,
7195 const glsl_type *type)
7196 {
7197 ir_variable *atomic = in_var(type, "atomic_var");
7198 ir_variable *data1 = in_var(type, "atomic_data1");
7199 ir_variable *data2 = in_var(type, "atomic_data2");
7200 MAKE_SIG(type, avail, 3, atomic, data1, data2);
7201
7202 ir_variable *retval = body.make_temp(type, "atomic_retval");
7203 body.emit(call(shader->symbols->get_function(intrinsic), retval,
7204 sig->parameters));
7205 body.emit(ret(retval));
7206 return sig;
7207 }
7208
7209 ir_function_signature *
7210 builtin_builder::_min3(const glsl_type *type)
7211 {
7212 ir_variable *x = in_var(type, "x");
7213 ir_variable *y = in_var(type, "y");
7214 ir_variable *z = in_var(type, "z");
7215 MAKE_SIG(type, shader_trinary_minmax, 3, x, y, z);
7216
7217 ir_expression *min3 = min2(x, min2(y,z));
7218 body.emit(ret(min3));
7219
7220 return sig;
7221 }
7222
7223 ir_function_signature *
7224 builtin_builder::_max3(const glsl_type *type)
7225 {
7226 ir_variable *x = in_var(type, "x");
7227 ir_variable *y = in_var(type, "y");
7228 ir_variable *z = in_var(type, "z");
7229 MAKE_SIG(type, shader_trinary_minmax, 3, x, y, z);
7230
7231 ir_expression *max3 = max2(x, max2(y,z));
7232 body.emit(ret(max3));
7233
7234 return sig;
7235 }
7236
7237 ir_function_signature *
7238 builtin_builder::_mid3(const glsl_type *type)
7239 {
7240 ir_variable *x = in_var(type, "x");
7241 ir_variable *y = in_var(type, "y");
7242 ir_variable *z = in_var(type, "z");
7243 MAKE_SIG(type, shader_trinary_minmax, 3, x, y, z);
7244
7245 ir_expression *mid3 = max2(min2(x, y), max2(min2(x, z), min2(y, z)));
7246 body.emit(ret(mid3));
7247
7248 return sig;
7249 }
7250
7251 static builtin_available_predicate
7252 get_image_available_predicate(const glsl_type *type, unsigned flags)
7253 {
7254 if ((flags & IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE) &&
7255 type->sampled_type == GLSL_TYPE_FLOAT)
7256 return shader_image_atomic_exchange_float;
7257
7258 if ((flags & IMAGE_FUNCTION_AVAIL_ATOMIC_ADD) &&
7259 type->sampled_type == GLSL_TYPE_FLOAT)
7260 return shader_image_atomic_add_float;
7261
7262 else if (flags & (IMAGE_FUNCTION_AVAIL_ATOMIC_EXCHANGE |
7263 IMAGE_FUNCTION_AVAIL_ATOMIC_ADD |
7264 IMAGE_FUNCTION_AVAIL_ATOMIC))
7265 return shader_image_atomic;
7266
7267 else if (flags & IMAGE_FUNCTION_EXT_ONLY)
7268 return shader_image_load_store_ext;
7269
7270 else
7271 return shader_image_load_store;
7272 }
7273
7274 ir_function_signature *
7275 builtin_builder::_image_prototype(const glsl_type *image_type,
7276 unsigned num_arguments,
7277 unsigned flags)
7278 {
7279 const glsl_type *data_type = glsl_type::get_instance(
7280 image_type->sampled_type,
7281 (flags & IMAGE_FUNCTION_HAS_VECTOR_DATA_TYPE ? 4 : 1),
7282 1);
7283 const glsl_type *ret_type = (flags & IMAGE_FUNCTION_RETURNS_VOID ?
7284 glsl_type::void_type : data_type);
7285
7286 /* Addressing arguments that are always present. */
7287 ir_variable *image = in_var(image_type, "image");
7288 ir_variable *coord = in_var(
7289 glsl_type::ivec(image_type->coordinate_components()), "coord");
7290
7291 ir_function_signature *sig = new_sig(
7292 ret_type, get_image_available_predicate(image_type, flags),
7293 2, image, coord);
7294
7295 /* Sample index for multisample images. */
7296 if (image_type->sampler_dimensionality == GLSL_SAMPLER_DIM_MS)
7297 sig->parameters.push_tail(in_var(glsl_type::int_type, "sample"));
7298
7299 /* Data arguments. */
7300 for (unsigned i = 0; i < num_arguments; ++i) {
7301 char *arg_name = ralloc_asprintf(NULL, "arg%d", i);
7302 sig->parameters.push_tail(in_var(data_type, arg_name));
7303 ralloc_free(arg_name);
7304 }
7305
7306 /* Set the maximal set of qualifiers allowed for this image
7307 * built-in. Function calls with arguments having fewer
7308 * qualifiers than present in the prototype are allowed by the
7309 * spec, but not with more, i.e. this will make the compiler
7310 * accept everything that needs to be accepted, and reject cases
7311 * like loads from write-only or stores to read-only images.
7312 */
7313 image->data.memory_read_only = (flags & IMAGE_FUNCTION_READ_ONLY) != 0;
7314 image->data.memory_write_only = (flags & IMAGE_FUNCTION_WRITE_ONLY) != 0;
7315 image->data.memory_coherent = true;
7316 image->data.memory_volatile = true;
7317 image->data.memory_restrict = true;
7318
7319 return sig;
7320 }
7321
7322 ir_function_signature *
7323 builtin_builder::_image_size_prototype(const glsl_type *image_type,
7324 unsigned /* num_arguments */,
7325 unsigned /* flags */)
7326 {
7327 const glsl_type *ret_type;
7328 unsigned num_components = image_type->coordinate_components();
7329
7330 /* From the ARB_shader_image_size extension:
7331 * "Cube images return the dimensions of one face."
7332 */
7333 if (image_type->sampler_dimensionality == GLSL_SAMPLER_DIM_CUBE &&
7334 !image_type->sampler_array) {
7335 num_components = 2;
7336 }
7337
7338 /* FIXME: Add the highp precision qualifier for GLES 3.10 when it is
7339 * supported by mesa.
7340 */
7341 ret_type = glsl_type::get_instance(GLSL_TYPE_INT, num_components, 1);
7342
7343 ir_variable *image = in_var(image_type, "image");
7344 ir_function_signature *sig = new_sig(ret_type, shader_image_size, 1, image);
7345
7346 /* Set the maximal set of qualifiers allowed for this image
7347 * built-in. Function calls with arguments having fewer
7348 * qualifiers than present in the prototype are allowed by the
7349 * spec, but not with more, i.e. this will make the compiler
7350 * accept everything that needs to be accepted, and reject cases
7351 * like loads from write-only or stores to read-only images.
7352 */
7353 image->data.memory_read_only = true;
7354 image->data.memory_write_only = true;
7355 image->data.memory_coherent = true;
7356 image->data.memory_volatile = true;
7357 image->data.memory_restrict = true;
7358
7359 return sig;
7360 }
7361
7362 ir_function_signature *
7363 builtin_builder::_image_samples_prototype(const glsl_type *image_type,
7364 unsigned /* num_arguments */,
7365 unsigned /* flags */)
7366 {
7367 ir_variable *image = in_var(image_type, "image");
7368 ir_function_signature *sig =
7369 new_sig(glsl_type::int_type, shader_samples, 1, image);
7370
7371 /* Set the maximal set of qualifiers allowed for this image
7372 * built-in. Function calls with arguments having fewer
7373 * qualifiers than present in the prototype are allowed by the
7374 * spec, but not with more, i.e. this will make the compiler
7375 * accept everything that needs to be accepted, and reject cases
7376 * like loads from write-only or stores to read-only images.
7377 */
7378 image->data.memory_read_only = true;
7379 image->data.memory_write_only = true;
7380 image->data.memory_coherent = true;
7381 image->data.memory_volatile = true;
7382 image->data.memory_restrict = true;
7383
7384 return sig;
7385 }
7386
7387 ir_function_signature *
7388 builtin_builder::_image(image_prototype_ctr prototype,
7389 const glsl_type *image_type,
7390 const char *intrinsic_name,
7391 unsigned num_arguments,
7392 unsigned flags,
7393 enum ir_intrinsic_id id)
7394 {
7395 ir_function_signature *sig = (this->*prototype)(image_type,
7396 num_arguments, flags);
7397
7398 if (flags & IMAGE_FUNCTION_EMIT_STUB) {
7399 ir_factory body(&sig->body, mem_ctx);
7400 ir_function *f = shader->symbols->get_function(intrinsic_name);
7401
7402 if (flags & IMAGE_FUNCTION_RETURNS_VOID) {
7403 body.emit(call(f, NULL, sig->parameters));
7404 } else {
7405 ir_variable *ret_val =
7406 body.make_temp(sig->return_type, "_ret_val");
7407 body.emit(call(f, ret_val, sig->parameters));
7408 body.emit(ret(ret_val));
7409 }
7410
7411 sig->is_defined = true;
7412
7413 } else {
7414 sig->intrinsic_id = id;
7415 }
7416
7417 return sig;
7418 }
7419
7420 ir_function_signature *
7421 builtin_builder::_memory_barrier_intrinsic(builtin_available_predicate avail,
7422 enum ir_intrinsic_id id)
7423 {
7424 MAKE_INTRINSIC(glsl_type::void_type, id, avail, 0);
7425 return sig;
7426 }
7427
7428 ir_function_signature *
7429 builtin_builder::_memory_barrier(const char *intrinsic_name,
7430 builtin_available_predicate avail)
7431 {
7432 MAKE_SIG(glsl_type::void_type, avail, 0);
7433 body.emit(call(shader->symbols->get_function(intrinsic_name),
7434 NULL, sig->parameters));
7435 return sig;
7436 }
7437
7438 ir_function_signature *
7439 builtin_builder::_ballot_intrinsic()
7440 {
7441 ir_variable *value = in_var(glsl_type::bool_type, "value");
7442 MAKE_INTRINSIC(glsl_type::uint64_t_type, ir_intrinsic_ballot, shader_ballot,
7443 1, value);
7444 return sig;
7445 }
7446
7447 ir_function_signature *
7448 builtin_builder::_ballot()
7449 {
7450 ir_variable *value = in_var(glsl_type::bool_type, "value");
7451
7452 MAKE_SIG(glsl_type::uint64_t_type, shader_ballot, 1, value);
7453 ir_variable *retval = body.make_temp(glsl_type::uint64_t_type, "retval");
7454
7455 body.emit(call(shader->symbols->get_function("__intrinsic_ballot"),
7456 retval, sig->parameters));
7457 body.emit(ret(retval));
7458 return sig;
7459 }
7460
7461 ir_function_signature *
7462 builtin_builder::_read_first_invocation_intrinsic(const glsl_type *type)
7463 {
7464 ir_variable *value = in_var(type, "value");
7465 MAKE_INTRINSIC(type, ir_intrinsic_read_first_invocation, shader_ballot,
7466 1, value);
7467 return sig;
7468 }
7469
7470 ir_function_signature *
7471 builtin_builder::_read_first_invocation(const glsl_type *type)
7472 {
7473 ir_variable *value = in_var(type, "value");
7474
7475 MAKE_SIG(type, shader_ballot, 1, value);
7476 ir_variable *retval = body.make_temp(type, "retval");
7477
7478 body.emit(call(shader->symbols->get_function("__intrinsic_read_first_invocation"),
7479 retval, sig->parameters));
7480 body.emit(ret(retval));
7481 return sig;
7482 }
7483
7484 ir_function_signature *
7485 builtin_builder::_read_invocation_intrinsic(const glsl_type *type)
7486 {
7487 ir_variable *value = in_var(type, "value");
7488 ir_variable *invocation = in_var(glsl_type::uint_type, "invocation");
7489 MAKE_INTRINSIC(type, ir_intrinsic_read_invocation, shader_ballot,
7490 2, value, invocation);
7491 return sig;
7492 }
7493
7494 ir_function_signature *
7495 builtin_builder::_read_invocation(const glsl_type *type)
7496 {
7497 ir_variable *value = in_var(type, "value");
7498 ir_variable *invocation = in_var(glsl_type::uint_type, "invocation");
7499
7500 MAKE_SIG(type, shader_ballot, 2, value, invocation);
7501 ir_variable *retval = body.make_temp(type, "retval");
7502
7503 body.emit(call(shader->symbols->get_function("__intrinsic_read_invocation"),
7504 retval, sig->parameters));
7505 body.emit(ret(retval));
7506 return sig;
7507 }
7508
7509 ir_function_signature *
7510 builtin_builder::_invocation_interlock_intrinsic(builtin_available_predicate avail,
7511 enum ir_intrinsic_id id)
7512 {
7513 MAKE_INTRINSIC(glsl_type::void_type, id, avail, 0);
7514 return sig;
7515 }
7516
7517 ir_function_signature *
7518 builtin_builder::_invocation_interlock(const char *intrinsic_name,
7519 builtin_available_predicate avail)
7520 {
7521 MAKE_SIG(glsl_type::void_type, avail, 0);
7522 body.emit(call(shader->symbols->get_function(intrinsic_name),
7523 NULL, sig->parameters));
7524 return sig;
7525 }
7526
7527 ir_function_signature *
7528 builtin_builder::_shader_clock_intrinsic(builtin_available_predicate avail,
7529 const glsl_type *type)
7530 {
7531 MAKE_INTRINSIC(type, ir_intrinsic_shader_clock, avail, 0);
7532 return sig;
7533 }
7534
7535 ir_function_signature *
7536 builtin_builder::_shader_clock(builtin_available_predicate avail,
7537 const glsl_type *type)
7538 {
7539 MAKE_SIG(type, avail, 0);
7540
7541 ir_variable *retval = body.make_temp(glsl_type::uvec2_type, "clock_retval");
7542
7543 body.emit(call(shader->symbols->get_function("__intrinsic_shader_clock"),
7544 retval, sig->parameters));
7545
7546 if (type == glsl_type::uint64_t_type) {
7547 body.emit(ret(expr(ir_unop_pack_uint_2x32, retval)));
7548 } else {
7549 body.emit(ret(retval));
7550 }
7551
7552 return sig;
7553 }
7554
7555 ir_function_signature *
7556 builtin_builder::_vote_intrinsic(builtin_available_predicate avail,
7557 enum ir_intrinsic_id id)
7558 {
7559 ir_variable *value = in_var(glsl_type::bool_type, "value");
7560 MAKE_INTRINSIC(glsl_type::bool_type, id, avail, 1, value);
7561 return sig;
7562 }
7563
7564 ir_function_signature *
7565 builtin_builder::_vote(const char *intrinsic_name,
7566 builtin_available_predicate avail)
7567 {
7568 ir_variable *value = in_var(glsl_type::bool_type, "value");
7569
7570 MAKE_SIG(glsl_type::bool_type, avail, 1, value);
7571
7572 ir_variable *retval = body.make_temp(glsl_type::bool_type, "retval");
7573
7574 body.emit(call(shader->symbols->get_function(intrinsic_name),
7575 retval, sig->parameters));
7576 body.emit(ret(retval));
7577 return sig;
7578 }
7579
7580 ir_function_signature *
7581 builtin_builder::_helper_invocation_intrinsic()
7582 {
7583 MAKE_INTRINSIC(glsl_type::bool_type, ir_intrinsic_helper_invocation,
7584 demote_to_helper_invocation, 0);
7585 return sig;
7586 }
7587
7588 ir_function_signature *
7589 builtin_builder::_helper_invocation()
7590 {
7591 MAKE_SIG(glsl_type::bool_type, demote_to_helper_invocation, 0);
7592
7593 ir_variable *retval = body.make_temp(glsl_type::bool_type, "retval");
7594
7595 body.emit(call(shader->symbols->get_function("__intrinsic_helper_invocation"),
7596 retval, sig->parameters));
7597 body.emit(ret(retval));
7598
7599 return sig;
7600 }
7601
7602 /** @} */
7603
7604 /******************************************************************************/
7605
7606 /* The singleton instance of builtin_builder. */
7607 static builtin_builder builtins;
7608 static mtx_t builtins_lock = _MTX_INITIALIZER_NP;
7609 static uint32_t builtin_users = 0;
7610
7611 /**
7612 * External API (exposing the built-in module to the rest of the compiler):
7613 * @{
7614 */
7615 extern "C" void
7616 _mesa_glsl_builtin_functions_init_or_ref()
7617 {
7618 mtx_lock(&builtins_lock);
7619 if (builtin_users++ == 0)
7620 builtins.initialize();
7621 mtx_unlock(&builtins_lock);
7622 }
7623
7624 extern "C" void
7625 _mesa_glsl_builtin_functions_decref()
7626 {
7627 mtx_lock(&builtins_lock);
7628 assert(builtin_users != 0);
7629 if (--builtin_users == 0)
7630 builtins.release();
7631 mtx_unlock(&builtins_lock);
7632 }
7633
7634 ir_function_signature *
7635 _mesa_glsl_find_builtin_function(_mesa_glsl_parse_state *state,
7636 const char *name, exec_list *actual_parameters)
7637 {
7638 ir_function_signature *s;
7639 mtx_lock(&builtins_lock);
7640 s = builtins.find(state, name, actual_parameters);
7641 mtx_unlock(&builtins_lock);
7642
7643 return s;
7644 }
7645
7646 bool
7647 _mesa_glsl_has_builtin_function(_mesa_glsl_parse_state *state, const char *name)
7648 {
7649 ir_function *f;
7650 bool ret = false;
7651 mtx_lock(&builtins_lock);
7652 f = builtins.shader->symbols->get_function(name);
7653 if (f != NULL) {
7654 foreach_in_list(ir_function_signature, sig, &f->signatures) {
7655 if (sig->is_builtin_available(state)) {
7656 ret = true;
7657 break;
7658 }
7659 }
7660 }
7661 mtx_unlock(&builtins_lock);
7662
7663 return ret;
7664 }
7665
7666 gl_shader *
7667 _mesa_glsl_get_builtin_function_shader()
7668 {
7669 return builtins.shader;
7670 }
7671
7672
7673 /**
7674 * Get the function signature for main from a shader
7675 */
7676 ir_function_signature *
7677 _mesa_get_main_function_signature(glsl_symbol_table *symbols)
7678 {
7679 ir_function *const f = symbols->get_function("main");
7680 if (f != NULL) {
7681 exec_list void_parameters;
7682
7683 /* Look for the 'void main()' signature and ensure that it's defined.
7684 * This keeps the linker from accidentally pick a shader that just
7685 * contains a prototype for main.
7686 *
7687 * We don't have to check for multiple definitions of main (in multiple
7688 * shaders) because that would have already been caught above.
7689 */
7690 ir_function_signature *sig =
7691 f->matching_signature(NULL, &void_parameters, false);
7692 if ((sig != NULL) && sig->is_defined) {
7693 return sig;
7694 }
7695 }
7696
7697 return NULL;
7698 }
7699
7700 /** @} */