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