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