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