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