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