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