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