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