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