llvmpipe: implement 64 bit mul opcodes in llvmpipe
[mesa.git] / src / glsl / builtin_functions.cpp
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 #include <stdarg.h>
57 #include <stdio.h>
58 #include "main/core.h" /* for struct gl_shader */
59 #include "main/shaderobj.h"
60 #include "ir_builder.h"
61 #include "glsl_parser_extras.h"
62 #include "program/prog_instruction.h"
63 #include <limits>
64
65 using namespace ir_builder;
66
67 /**
68 * Availability predicates:
69 * @{
70 */
71 static bool
72 always_available(const _mesa_glsl_parse_state *state)
73 {
74 return true;
75 }
76
77 static bool
78 compatibility_vs_only(const _mesa_glsl_parse_state *state)
79 {
80 return state->target == vertex_shader &&
81 state->language_version <= 130 &&
82 !state->es_shader;
83 }
84
85 static bool
86 fs_only(const _mesa_glsl_parse_state *state)
87 {
88 return state->target == fragment_shader;
89 }
90
91 static bool
92 gs_only(const _mesa_glsl_parse_state *state)
93 {
94 return state->target == geometry_shader;
95 }
96
97 static bool
98 v110(const _mesa_glsl_parse_state *state)
99 {
100 return !state->es_shader;
101 }
102
103 static bool
104 v110_fs_only(const _mesa_glsl_parse_state *state)
105 {
106 return !state->es_shader && state->target == fragment_shader;
107 }
108
109 static bool
110 v120(const _mesa_glsl_parse_state *state)
111 {
112 return state->is_version(120, 300);
113 }
114
115 static bool
116 v130(const _mesa_glsl_parse_state *state)
117 {
118 return state->is_version(130, 300);
119 }
120
121 static bool
122 v130_fs_only(const _mesa_glsl_parse_state *state)
123 {
124 return state->is_version(130, 300) &&
125 state->target == fragment_shader;
126 }
127
128 static bool
129 v140(const _mesa_glsl_parse_state *state)
130 {
131 return state->is_version(140, 0);
132 }
133
134 static bool
135 texture_rectangle(const _mesa_glsl_parse_state *state)
136 {
137 return state->ARB_texture_rectangle_enable;
138 }
139
140 static bool
141 texture_external(const _mesa_glsl_parse_state *state)
142 {
143 return state->OES_EGL_image_external_enable;
144 }
145
146 /** True if texturing functions with explicit LOD are allowed. */
147 static bool
148 lod_exists_in_stage(const _mesa_glsl_parse_state *state)
149 {
150 /* Texturing functions with "Lod" in their name exist:
151 * - In the vertex shader stage (for all languages)
152 * - In any stage for GLSL 1.30+ or GLSL ES 3.00
153 * - In any stage for desktop GLSL with ARB_shader_texture_lod enabled.
154 *
155 * Since ARB_shader_texture_lod can only be enabled on desktop GLSL, we
156 * don't need to explicitly check state->es_shader.
157 */
158 return state->target == vertex_shader ||
159 state->is_version(130, 300) ||
160 state->ARB_shader_texture_lod_enable;
161 }
162
163 static bool
164 v110_lod(const _mesa_glsl_parse_state *state)
165 {
166 return !state->es_shader && lod_exists_in_stage(state);
167 }
168
169 static bool
170 shader_texture_lod(const _mesa_glsl_parse_state *state)
171 {
172 return state->ARB_shader_texture_lod_enable;
173 }
174
175 static bool
176 shader_texture_lod_and_rect(const _mesa_glsl_parse_state *state)
177 {
178 return state->ARB_shader_texture_lod_enable &&
179 state->ARB_texture_rectangle_enable;
180 }
181
182 static bool
183 shader_bit_encoding(const _mesa_glsl_parse_state *state)
184 {
185 return state->is_version(330, 300) ||
186 state->ARB_shader_bit_encoding_enable ||
187 state->ARB_gpu_shader5_enable;
188 }
189
190 static bool
191 shader_integer_mix(const _mesa_glsl_parse_state *state)
192 {
193 return v130(state) && state->EXT_shader_integer_mix_enable;
194 }
195
196 static bool
197 shader_packing(const _mesa_glsl_parse_state *state)
198 {
199 return state->ARB_shading_language_packing_enable ||
200 state->is_version(400, 0);
201 }
202
203 static bool
204 shader_packing_or_es3(const _mesa_glsl_parse_state *state)
205 {
206 return state->ARB_shading_language_packing_enable ||
207 state->is_version(400, 300);
208 }
209
210 static bool
211 gpu_shader5(const _mesa_glsl_parse_state *state)
212 {
213 return state->is_version(400, 0) || state->ARB_gpu_shader5_enable;
214 }
215
216 static bool
217 texture_array_lod(const _mesa_glsl_parse_state *state)
218 {
219 return lod_exists_in_stage(state) &&
220 state->EXT_texture_array_enable;
221 }
222
223 static bool
224 fs_texture_array(const _mesa_glsl_parse_state *state)
225 {
226 return state->target == fragment_shader &&
227 state->EXT_texture_array_enable;
228 }
229
230 static bool
231 texture_array(const _mesa_glsl_parse_state *state)
232 {
233 return state->EXT_texture_array_enable;
234 }
235
236 static bool
237 texture_multisample(const _mesa_glsl_parse_state *state)
238 {
239 return state->is_version(150, 0) ||
240 state->ARB_texture_multisample_enable;
241 }
242
243 static bool
244 fs_texture_cube_map_array(const _mesa_glsl_parse_state *state)
245 {
246 return state->target == fragment_shader &&
247 (state->is_version(400, 0) ||
248 state->ARB_texture_cube_map_array_enable);
249 }
250
251 static bool
252 texture_cube_map_array(const _mesa_glsl_parse_state *state)
253 {
254 return state->is_version(400, 0) ||
255 state->ARB_texture_cube_map_array_enable;
256 }
257
258 static bool
259 texture_query_levels(const _mesa_glsl_parse_state *state)
260 {
261 return state->is_version(430, 0) ||
262 state->ARB_texture_query_levels_enable;
263 }
264
265 static bool
266 texture_query_lod(const _mesa_glsl_parse_state *state)
267 {
268 return state->target == fragment_shader &&
269 state->ARB_texture_query_lod_enable;
270 }
271
272 static bool
273 texture_gather(const _mesa_glsl_parse_state *state)
274 {
275 return state->is_version(400, 0) ||
276 state->ARB_texture_gather_enable ||
277 state->ARB_gpu_shader5_enable;
278 }
279
280 /* Desktop GL or OES_standard_derivatives + fragment shader only */
281 static bool
282 fs_oes_derivatives(const _mesa_glsl_parse_state *state)
283 {
284 return state->target == fragment_shader &&
285 (!state->es_shader || state->OES_standard_derivatives_enable);
286 }
287
288 static bool
289 tex1d_lod(const _mesa_glsl_parse_state *state)
290 {
291 return !state->es_shader && lod_exists_in_stage(state);
292 }
293
294 /** True if sampler3D exists */
295 static bool
296 tex3d(const _mesa_glsl_parse_state *state)
297 {
298 /* sampler3D exists in all desktop GLSL versions, GLSL ES 1.00 with the
299 * OES_texture_3D extension, and in GLSL ES 3.00.
300 */
301 return !state->es_shader ||
302 state->OES_texture_3D_enable ||
303 state->language_version >= 300;
304 }
305
306 static bool
307 fs_tex3d(const _mesa_glsl_parse_state *state)
308 {
309 return state->target == fragment_shader &&
310 (!state->es_shader || state->OES_texture_3D_enable);
311 }
312
313 static bool
314 tex3d_lod(const _mesa_glsl_parse_state *state)
315 {
316 return tex3d(state) && lod_exists_in_stage(state);
317 }
318 /** @} */
319
320 /******************************************************************************/
321
322 namespace {
323
324 /**
325 * builtin_builder: A singleton object representing the core of the built-in
326 * function module.
327 *
328 * It generates IR for every built-in function signature, and organizes them
329 * into functions.
330 */
331 class builtin_builder {
332 public:
333 builtin_builder();
334 ~builtin_builder();
335
336 void initialize();
337 void release();
338 ir_function_signature *find(_mesa_glsl_parse_state *state,
339 const char *name, exec_list *actual_parameters);
340
341 private:
342 void *mem_ctx;
343 /**
344 * A shader to hold all the built-in signatures; created by this module.
345 *
346 * This includes signatures for every built-in, regardless of version or
347 * enabled extensions. The availability predicate associated with each
348 * signature allows matching_signature() to filter out the irrelevant ones.
349 */
350 gl_shader *shader;
351
352 /** Global variables used by built-in functions. */
353 ir_variable *gl_ModelViewProjectionMatrix;
354 ir_variable *gl_Vertex;
355
356 void create_shader();
357 void create_builtins();
358
359 /**
360 * IR builder helpers:
361 *
362 * These convenience functions assist in emitting IR, but don't necessarily
363 * fit in ir_builder itself. Many of them rely on having a mem_ctx class
364 * member available.
365 */
366 ir_variable *in_var(const glsl_type *type, const char *name);
367 ir_variable *out_var(const glsl_type *type, const char *name);
368 ir_constant *imm(float f, unsigned vector_elements=1);
369 ir_constant *imm(int i, unsigned vector_elements=1);
370 ir_constant *imm(unsigned u, unsigned vector_elements=1);
371 ir_constant *imm(const glsl_type *type, const ir_constant_data &);
372 ir_dereference_variable *var_ref(ir_variable *var);
373 ir_dereference_array *array_ref(ir_variable *var, int i);
374 ir_swizzle *matrix_elt(ir_variable *var, int col, int row);
375
376 ir_expression *asin_expr(ir_variable *x);
377
378 /** Create a new function and add the given signatures. */
379 void add_function(const char *name, ...);
380
381 ir_function_signature *new_sig(const glsl_type *return_type,
382 builtin_available_predicate avail,
383 int num_params, ...);
384
385 /**
386 * Function signature generators:
387 * @{
388 */
389 ir_function_signature *unop(builtin_available_predicate avail,
390 ir_expression_operation opcode,
391 const glsl_type *return_type,
392 const glsl_type *param_type);
393 ir_function_signature *binop(ir_expression_operation opcode,
394 builtin_available_predicate avail,
395 const glsl_type *return_type,
396 const glsl_type *param0_type,
397 const glsl_type *param1_type);
398
399 #define B0(X) ir_function_signature *_##X();
400 #define B1(X) ir_function_signature *_##X(const glsl_type *);
401 #define B2(X) ir_function_signature *_##X(const glsl_type *, const glsl_type *);
402 #define B3(X) ir_function_signature *_##X(const glsl_type *, const glsl_type *, const glsl_type *);
403 #define BA1(X) ir_function_signature *_##X(builtin_available_predicate, const glsl_type *);
404 #define BA2(X) ir_function_signature *_##X(builtin_available_predicate, const glsl_type *, const glsl_type *);
405 B1(radians)
406 B1(degrees)
407 B1(sin)
408 B1(cos)
409 B1(tan)
410 B1(asin)
411 B1(acos)
412 B1(atan2)
413 B1(atan)
414 B1(sinh)
415 B1(cosh)
416 B1(tanh)
417 B1(asinh)
418 B1(acosh)
419 B1(atanh)
420 B1(pow)
421 B1(exp)
422 B1(log)
423 B1(exp2)
424 B1(log2)
425 B1(sqrt)
426 B1(inversesqrt)
427 B1(abs)
428 B1(sign)
429 B1(floor)
430 B1(trunc)
431 B1(round)
432 B1(roundEven)
433 B1(ceil)
434 B1(fract)
435 B2(mod)
436 B1(modf)
437 BA2(min)
438 BA2(max)
439 BA2(clamp)
440 B2(mix_lrp)
441 ir_function_signature *_mix_sel(builtin_available_predicate avail,
442 const glsl_type *val_type,
443 const glsl_type *blend_type);
444 B2(step)
445 B2(smoothstep)
446 B1(isnan)
447 B1(isinf)
448 B1(floatBitsToInt)
449 B1(floatBitsToUint)
450 B1(intBitsToFloat)
451 B1(uintBitsToFloat)
452 ir_function_signature *_packUnorm2x16(builtin_available_predicate avail);
453 ir_function_signature *_packSnorm2x16(builtin_available_predicate avail);
454 ir_function_signature *_packUnorm4x8(builtin_available_predicate avail);
455 ir_function_signature *_packSnorm4x8(builtin_available_predicate avail);
456 ir_function_signature *_unpackUnorm2x16(builtin_available_predicate avail);
457 ir_function_signature *_unpackSnorm2x16(builtin_available_predicate avail);
458 ir_function_signature *_unpackUnorm4x8(builtin_available_predicate avail);
459 ir_function_signature *_unpackSnorm4x8(builtin_available_predicate avail);
460 ir_function_signature *_packHalf2x16(builtin_available_predicate avail);
461 ir_function_signature *_unpackHalf2x16(builtin_available_predicate avail);
462 B1(length)
463 B1(distance);
464 B1(dot);
465 B1(cross);
466 B1(normalize);
467 B0(ftransform);
468 B1(faceforward);
469 B1(reflect);
470 B1(refract);
471 B1(matrixCompMult);
472 B1(outerProduct);
473 B0(determinant_mat2);
474 B0(determinant_mat3);
475 B0(determinant_mat4);
476 B0(inverse_mat2);
477 B0(inverse_mat3);
478 B0(inverse_mat4);
479 B1(transpose);
480 BA1(lessThan);
481 BA1(lessThanEqual);
482 BA1(greaterThan);
483 BA1(greaterThanEqual);
484 BA1(equal);
485 BA1(notEqual);
486 B1(any);
487 B1(all);
488 B1(not);
489 B2(textureSize);
490 ir_function_signature *_textureSize(builtin_available_predicate avail,
491 const glsl_type *return_type,
492 const glsl_type *sampler_type);
493
494 /** Flags to _texture() */
495 #define TEX_PROJECT 1
496 #define TEX_OFFSET 2
497 #define TEX_COMPONENT 4
498
499 ir_function_signature *_texture(ir_texture_opcode opcode,
500 builtin_available_predicate avail,
501 const glsl_type *return_type,
502 const glsl_type *sampler_type,
503 const glsl_type *coord_type,
504 int flags = 0);
505 B0(textureCubeArrayShadow);
506 ir_function_signature *_texelFetch(builtin_available_predicate avail,
507 const glsl_type *return_type,
508 const glsl_type *sampler_type,
509 const glsl_type *coord_type,
510 const glsl_type *offset_type = NULL);
511
512 B0(EmitVertex)
513 B0(EndPrimitive)
514
515 B2(textureQueryLod);
516 B1(textureQueryLevels);
517 B1(dFdx);
518 B1(dFdy);
519 B1(fwidth);
520 B1(noise1);
521 B1(noise2);
522 B1(noise3);
523 B1(noise4);
524
525 B1(bitfieldExtract)
526 B1(bitfieldInsert)
527 B1(bitfieldReverse)
528 B1(bitCount)
529 B1(findLSB)
530 B1(findMSB)
531 B1(fma)
532 B2(ldexp)
533 B2(frexp)
534 B1(uaddCarry)
535 B1(usubBorrow)
536 B1(mulExtended)
537 #undef B0
538 #undef B1
539 #undef B2
540 #undef B3
541 #undef BA1
542 #undef BA2
543 /** @} */
544 };
545
546 } /* anonymous namespace */
547
548 /**
549 * Core builtin_builder functionality:
550 * @{
551 */
552 builtin_builder::builtin_builder()
553 : shader(NULL),
554 gl_ModelViewProjectionMatrix(NULL),
555 gl_Vertex(NULL)
556 {
557 mem_ctx = NULL;
558 }
559
560 builtin_builder::~builtin_builder()
561 {
562 ralloc_free(mem_ctx);
563 }
564
565 ir_function_signature *
566 builtin_builder::find(_mesa_glsl_parse_state *state,
567 const char *name, exec_list *actual_parameters)
568 {
569 /* The shader currently being compiled requested a built-in function;
570 * it needs to link against builtin_builder::shader in order to get them.
571 *
572 * Even if we don't find a matching signature, we still need to do this so
573 * that the "no matching signature" error will list potential candidates
574 * from the available built-ins.
575 */
576 state->builtins_to_link[0] = shader;
577 state->num_builtins_to_link = 1;
578
579 ir_function *f = shader->symbols->get_function(name);
580 if (f == NULL)
581 return NULL;
582
583 ir_function_signature *sig = f->matching_signature(state, actual_parameters);
584 if (sig == NULL)
585 return NULL;
586
587 return sig;
588 }
589
590 void
591 builtin_builder::initialize()
592 {
593 /* If already initialized, don't do it again. */
594 if (mem_ctx != NULL)
595 return;
596
597 mem_ctx = ralloc_context(NULL);
598 create_shader();
599 create_builtins();
600 }
601
602 void
603 builtin_builder::release()
604 {
605 ralloc_free(mem_ctx);
606 mem_ctx = NULL;
607
608 ralloc_free(shader);
609 shader = NULL;
610 }
611
612 void
613 builtin_builder::create_shader()
614 {
615 /* The target doesn't actually matter. There's no target for generic
616 * GLSL utility code that could be linked against any stage, so just
617 * arbitrarily pick GL_VERTEX_SHADER.
618 */
619 shader = _mesa_new_shader(NULL, 0, GL_VERTEX_SHADER);
620 shader->symbols = new(mem_ctx) glsl_symbol_table;
621
622 gl_ModelViewProjectionMatrix =
623 new(mem_ctx) ir_variable(glsl_type::mat4_type,
624 "gl_ModelViewProjectionMatrix",
625 ir_var_uniform);
626
627 shader->symbols->add_variable(gl_ModelViewProjectionMatrix);
628
629 gl_Vertex = in_var(glsl_type::vec4_type, "gl_Vertex");
630 shader->symbols->add_variable(gl_Vertex);
631 }
632
633 /** @} */
634
635 /**
636 * Create ir_function and ir_function_signature objects for each built-in.
637 *
638 * Contains a list of every available built-in.
639 */
640 void
641 builtin_builder::create_builtins()
642 {
643 #define F(NAME) \
644 add_function(#NAME, \
645 _##NAME(glsl_type::float_type), \
646 _##NAME(glsl_type::vec2_type), \
647 _##NAME(glsl_type::vec3_type), \
648 _##NAME(glsl_type::vec4_type), \
649 NULL);
650
651 #define FI(NAME) \
652 add_function(#NAME, \
653 _##NAME(glsl_type::float_type), \
654 _##NAME(glsl_type::vec2_type), \
655 _##NAME(glsl_type::vec3_type), \
656 _##NAME(glsl_type::vec4_type), \
657 _##NAME(glsl_type::int_type), \
658 _##NAME(glsl_type::ivec2_type), \
659 _##NAME(glsl_type::ivec3_type), \
660 _##NAME(glsl_type::ivec4_type), \
661 NULL);
662
663 #define FIU(NAME) \
664 add_function(#NAME, \
665 _##NAME(always_available, glsl_type::float_type), \
666 _##NAME(always_available, glsl_type::vec2_type), \
667 _##NAME(always_available, glsl_type::vec3_type), \
668 _##NAME(always_available, glsl_type::vec4_type), \
669 \
670 _##NAME(always_available, glsl_type::int_type), \
671 _##NAME(always_available, glsl_type::ivec2_type), \
672 _##NAME(always_available, glsl_type::ivec3_type), \
673 _##NAME(always_available, glsl_type::ivec4_type), \
674 \
675 _##NAME(v130, glsl_type::uint_type), \
676 _##NAME(v130, glsl_type::uvec2_type), \
677 _##NAME(v130, glsl_type::uvec3_type), \
678 _##NAME(v130, glsl_type::uvec4_type), \
679 NULL);
680
681 #define IU(NAME) \
682 add_function(#NAME, \
683 _##NAME(glsl_type::int_type), \
684 _##NAME(glsl_type::ivec2_type), \
685 _##NAME(glsl_type::ivec3_type), \
686 _##NAME(glsl_type::ivec4_type), \
687 \
688 _##NAME(glsl_type::uint_type), \
689 _##NAME(glsl_type::uvec2_type), \
690 _##NAME(glsl_type::uvec3_type), \
691 _##NAME(glsl_type::uvec4_type), \
692 NULL);
693
694 #define FIUB(NAME) \
695 add_function(#NAME, \
696 _##NAME(always_available, glsl_type::float_type), \
697 _##NAME(always_available, glsl_type::vec2_type), \
698 _##NAME(always_available, glsl_type::vec3_type), \
699 _##NAME(always_available, glsl_type::vec4_type), \
700 \
701 _##NAME(always_available, glsl_type::int_type), \
702 _##NAME(always_available, glsl_type::ivec2_type), \
703 _##NAME(always_available, glsl_type::ivec3_type), \
704 _##NAME(always_available, glsl_type::ivec4_type), \
705 \
706 _##NAME(v130, glsl_type::uint_type), \
707 _##NAME(v130, glsl_type::uvec2_type), \
708 _##NAME(v130, glsl_type::uvec3_type), \
709 _##NAME(v130, glsl_type::uvec4_type), \
710 \
711 _##NAME(always_available, glsl_type::bool_type), \
712 _##NAME(always_available, glsl_type::bvec2_type), \
713 _##NAME(always_available, glsl_type::bvec3_type), \
714 _##NAME(always_available, glsl_type::bvec4_type), \
715 NULL);
716
717 #define FIU2_MIXED(NAME) \
718 add_function(#NAME, \
719 _##NAME(always_available, glsl_type::float_type, glsl_type::float_type), \
720 _##NAME(always_available, glsl_type::vec2_type, glsl_type::float_type), \
721 _##NAME(always_available, glsl_type::vec3_type, glsl_type::float_type), \
722 _##NAME(always_available, glsl_type::vec4_type, glsl_type::float_type), \
723 \
724 _##NAME(always_available, glsl_type::vec2_type, glsl_type::vec2_type), \
725 _##NAME(always_available, glsl_type::vec3_type, glsl_type::vec3_type), \
726 _##NAME(always_available, glsl_type::vec4_type, glsl_type::vec4_type), \
727 \
728 _##NAME(always_available, glsl_type::int_type, glsl_type::int_type), \
729 _##NAME(always_available, glsl_type::ivec2_type, glsl_type::int_type), \
730 _##NAME(always_available, glsl_type::ivec3_type, glsl_type::int_type), \
731 _##NAME(always_available, glsl_type::ivec4_type, glsl_type::int_type), \
732 \
733 _##NAME(always_available, glsl_type::ivec2_type, glsl_type::ivec2_type), \
734 _##NAME(always_available, glsl_type::ivec3_type, glsl_type::ivec3_type), \
735 _##NAME(always_available, glsl_type::ivec4_type, glsl_type::ivec4_type), \
736 \
737 _##NAME(v130, glsl_type::uint_type, glsl_type::uint_type), \
738 _##NAME(v130, glsl_type::uvec2_type, glsl_type::uint_type), \
739 _##NAME(v130, glsl_type::uvec3_type, glsl_type::uint_type), \
740 _##NAME(v130, glsl_type::uvec4_type, glsl_type::uint_type), \
741 \
742 _##NAME(v130, glsl_type::uvec2_type, glsl_type::uvec2_type), \
743 _##NAME(v130, glsl_type::uvec3_type, glsl_type::uvec3_type), \
744 _##NAME(v130, glsl_type::uvec4_type, glsl_type::uvec4_type), \
745 NULL);
746
747 F(radians)
748 F(degrees)
749 F(sin)
750 F(cos)
751 F(tan)
752 F(asin)
753 F(acos)
754
755 add_function("atan",
756 _atan(glsl_type::float_type),
757 _atan(glsl_type::vec2_type),
758 _atan(glsl_type::vec3_type),
759 _atan(glsl_type::vec4_type),
760 _atan2(glsl_type::float_type),
761 _atan2(glsl_type::vec2_type),
762 _atan2(glsl_type::vec3_type),
763 _atan2(glsl_type::vec4_type),
764 NULL);
765
766 F(sinh)
767 F(cosh)
768 F(tanh)
769 F(asinh)
770 F(acosh)
771 F(atanh)
772 F(pow)
773 F(exp)
774 F(log)
775 F(exp2)
776 F(log2)
777 F(sqrt)
778 F(inversesqrt)
779 FI(abs)
780 FI(sign)
781 F(floor)
782 F(trunc)
783 F(round)
784 F(roundEven)
785 F(ceil)
786 F(fract)
787
788 add_function("mod",
789 _mod(glsl_type::float_type, glsl_type::float_type),
790 _mod(glsl_type::vec2_type, glsl_type::float_type),
791 _mod(glsl_type::vec3_type, glsl_type::float_type),
792 _mod(glsl_type::vec4_type, glsl_type::float_type),
793
794 _mod(glsl_type::vec2_type, glsl_type::vec2_type),
795 _mod(glsl_type::vec3_type, glsl_type::vec3_type),
796 _mod(glsl_type::vec4_type, glsl_type::vec4_type),
797 NULL);
798
799 F(modf)
800
801 FIU2_MIXED(min)
802 FIU2_MIXED(max)
803 FIU2_MIXED(clamp)
804
805 add_function("mix",
806 _mix_lrp(glsl_type::float_type, glsl_type::float_type),
807 _mix_lrp(glsl_type::vec2_type, glsl_type::float_type),
808 _mix_lrp(glsl_type::vec3_type, glsl_type::float_type),
809 _mix_lrp(glsl_type::vec4_type, glsl_type::float_type),
810
811 _mix_lrp(glsl_type::vec2_type, glsl_type::vec2_type),
812 _mix_lrp(glsl_type::vec3_type, glsl_type::vec3_type),
813 _mix_lrp(glsl_type::vec4_type, glsl_type::vec4_type),
814
815 _mix_sel(v130, glsl_type::float_type, glsl_type::bool_type),
816 _mix_sel(v130, glsl_type::vec2_type, glsl_type::bvec2_type),
817 _mix_sel(v130, glsl_type::vec3_type, glsl_type::bvec3_type),
818 _mix_sel(v130, glsl_type::vec4_type, glsl_type::bvec4_type),
819
820 _mix_sel(shader_integer_mix, glsl_type::int_type, glsl_type::bool_type),
821 _mix_sel(shader_integer_mix, glsl_type::ivec2_type, glsl_type::bvec2_type),
822 _mix_sel(shader_integer_mix, glsl_type::ivec3_type, glsl_type::bvec3_type),
823 _mix_sel(shader_integer_mix, glsl_type::ivec4_type, glsl_type::bvec4_type),
824
825 _mix_sel(shader_integer_mix, glsl_type::uint_type, glsl_type::bool_type),
826 _mix_sel(shader_integer_mix, glsl_type::uvec2_type, glsl_type::bvec2_type),
827 _mix_sel(shader_integer_mix, glsl_type::uvec3_type, glsl_type::bvec3_type),
828 _mix_sel(shader_integer_mix, glsl_type::uvec4_type, glsl_type::bvec4_type),
829
830 _mix_sel(shader_integer_mix, glsl_type::bool_type, glsl_type::bool_type),
831 _mix_sel(shader_integer_mix, glsl_type::bvec2_type, glsl_type::bvec2_type),
832 _mix_sel(shader_integer_mix, glsl_type::bvec3_type, glsl_type::bvec3_type),
833 _mix_sel(shader_integer_mix, glsl_type::bvec4_type, glsl_type::bvec4_type),
834 NULL);
835
836 add_function("step",
837 _step(glsl_type::float_type, glsl_type::float_type),
838 _step(glsl_type::float_type, glsl_type::vec2_type),
839 _step(glsl_type::float_type, glsl_type::vec3_type),
840 _step(glsl_type::float_type, glsl_type::vec4_type),
841
842 _step(glsl_type::vec2_type, glsl_type::vec2_type),
843 _step(glsl_type::vec3_type, glsl_type::vec3_type),
844 _step(glsl_type::vec4_type, glsl_type::vec4_type),
845 NULL);
846
847 add_function("smoothstep",
848 _smoothstep(glsl_type::float_type, glsl_type::float_type),
849 _smoothstep(glsl_type::float_type, glsl_type::vec2_type),
850 _smoothstep(glsl_type::float_type, glsl_type::vec3_type),
851 _smoothstep(glsl_type::float_type, glsl_type::vec4_type),
852
853 _smoothstep(glsl_type::vec2_type, glsl_type::vec2_type),
854 _smoothstep(glsl_type::vec3_type, glsl_type::vec3_type),
855 _smoothstep(glsl_type::vec4_type, glsl_type::vec4_type),
856 NULL);
857
858 F(isnan)
859 F(isinf)
860
861 F(floatBitsToInt)
862 F(floatBitsToUint)
863 add_function("intBitsToFloat",
864 _intBitsToFloat(glsl_type::int_type),
865 _intBitsToFloat(glsl_type::ivec2_type),
866 _intBitsToFloat(glsl_type::ivec3_type),
867 _intBitsToFloat(glsl_type::ivec4_type),
868 NULL);
869 add_function("uintBitsToFloat",
870 _uintBitsToFloat(glsl_type::uint_type),
871 _uintBitsToFloat(glsl_type::uvec2_type),
872 _uintBitsToFloat(glsl_type::uvec3_type),
873 _uintBitsToFloat(glsl_type::uvec4_type),
874 NULL);
875
876 add_function("packUnorm2x16", _packUnorm2x16(shader_packing_or_es3), NULL);
877 add_function("packSnorm2x16", _packSnorm2x16(shader_packing_or_es3), NULL);
878 add_function("packUnorm4x8", _packUnorm4x8(shader_packing), NULL);
879 add_function("packSnorm4x8", _packSnorm4x8(shader_packing), NULL);
880 add_function("unpackUnorm2x16", _unpackUnorm2x16(shader_packing_or_es3), NULL);
881 add_function("unpackSnorm2x16", _unpackSnorm2x16(shader_packing_or_es3), NULL);
882 add_function("unpackUnorm4x8", _unpackUnorm4x8(shader_packing), NULL);
883 add_function("unpackSnorm4x8", _unpackSnorm4x8(shader_packing), NULL);
884 add_function("packHalf2x16", _packHalf2x16(shader_packing_or_es3), NULL);
885 add_function("unpackHalf2x16", _unpackHalf2x16(shader_packing_or_es3), NULL);
886
887 F(length)
888 F(distance)
889 F(dot)
890
891 add_function("cross", _cross(glsl_type::vec3_type), NULL);
892
893 F(normalize)
894 add_function("ftransform", _ftransform(), NULL);
895 F(faceforward)
896 F(reflect)
897 F(refract)
898 // ...
899 add_function("matrixCompMult",
900 _matrixCompMult(glsl_type::mat2_type),
901 _matrixCompMult(glsl_type::mat3_type),
902 _matrixCompMult(glsl_type::mat4_type),
903 _matrixCompMult(glsl_type::mat2x3_type),
904 _matrixCompMult(glsl_type::mat2x4_type),
905 _matrixCompMult(glsl_type::mat3x2_type),
906 _matrixCompMult(glsl_type::mat3x4_type),
907 _matrixCompMult(glsl_type::mat4x2_type),
908 _matrixCompMult(glsl_type::mat4x3_type),
909 NULL);
910 add_function("outerProduct",
911 _outerProduct(glsl_type::mat2_type),
912 _outerProduct(glsl_type::mat3_type),
913 _outerProduct(glsl_type::mat4_type),
914 _outerProduct(glsl_type::mat2x3_type),
915 _outerProduct(glsl_type::mat2x4_type),
916 _outerProduct(glsl_type::mat3x2_type),
917 _outerProduct(glsl_type::mat3x4_type),
918 _outerProduct(glsl_type::mat4x2_type),
919 _outerProduct(glsl_type::mat4x3_type),
920 NULL);
921 add_function("determinant",
922 _determinant_mat2(),
923 _determinant_mat3(),
924 _determinant_mat4(),
925 NULL);
926 add_function("inverse",
927 _inverse_mat2(),
928 _inverse_mat3(),
929 _inverse_mat4(),
930 NULL);
931 add_function("transpose",
932 _transpose(glsl_type::mat2_type),
933 _transpose(glsl_type::mat3_type),
934 _transpose(glsl_type::mat4_type),
935 _transpose(glsl_type::mat2x3_type),
936 _transpose(glsl_type::mat2x4_type),
937 _transpose(glsl_type::mat3x2_type),
938 _transpose(glsl_type::mat3x4_type),
939 _transpose(glsl_type::mat4x2_type),
940 _transpose(glsl_type::mat4x3_type),
941 NULL);
942 FIU(lessThan)
943 FIU(lessThanEqual)
944 FIU(greaterThan)
945 FIU(greaterThanEqual)
946 FIUB(notEqual)
947 FIUB(equal)
948
949 add_function("any",
950 _any(glsl_type::bvec2_type),
951 _any(glsl_type::bvec3_type),
952 _any(glsl_type::bvec4_type),
953 NULL);
954
955 add_function("all",
956 _all(glsl_type::bvec2_type),
957 _all(glsl_type::bvec3_type),
958 _all(glsl_type::bvec4_type),
959 NULL);
960
961 add_function("not",
962 _not(glsl_type::bvec2_type),
963 _not(glsl_type::bvec3_type),
964 _not(glsl_type::bvec4_type),
965 NULL);
966
967 add_function("textureSize",
968 _textureSize(v130, glsl_type::int_type, glsl_type::sampler1D_type),
969 _textureSize(v130, glsl_type::int_type, glsl_type::isampler1D_type),
970 _textureSize(v130, glsl_type::int_type, glsl_type::usampler1D_type),
971
972 _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler2D_type),
973 _textureSize(v130, glsl_type::ivec2_type, glsl_type::isampler2D_type),
974 _textureSize(v130, glsl_type::ivec2_type, glsl_type::usampler2D_type),
975
976 _textureSize(v130, glsl_type::ivec3_type, glsl_type::sampler3D_type),
977 _textureSize(v130, glsl_type::ivec3_type, glsl_type::isampler3D_type),
978 _textureSize(v130, glsl_type::ivec3_type, glsl_type::usampler3D_type),
979
980 _textureSize(v130, glsl_type::ivec2_type, glsl_type::samplerCube_type),
981 _textureSize(v130, glsl_type::ivec2_type, glsl_type::isamplerCube_type),
982 _textureSize(v130, glsl_type::ivec2_type, glsl_type::usamplerCube_type),
983
984 _textureSize(v130, glsl_type::int_type, glsl_type::sampler1DShadow_type),
985 _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler2DShadow_type),
986 _textureSize(v130, glsl_type::ivec2_type, glsl_type::samplerCubeShadow_type),
987
988 _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler1DArray_type),
989 _textureSize(v130, glsl_type::ivec2_type, glsl_type::isampler1DArray_type),
990 _textureSize(v130, glsl_type::ivec2_type, glsl_type::usampler1DArray_type),
991 _textureSize(v130, glsl_type::ivec3_type, glsl_type::sampler2DArray_type),
992 _textureSize(v130, glsl_type::ivec3_type, glsl_type::isampler2DArray_type),
993 _textureSize(v130, glsl_type::ivec3_type, glsl_type::usampler2DArray_type),
994
995 _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler1DArrayShadow_type),
996 _textureSize(v130, glsl_type::ivec3_type, glsl_type::sampler2DArrayShadow_type),
997
998 _textureSize(texture_cube_map_array, glsl_type::ivec3_type, glsl_type::samplerCubeArray_type),
999 _textureSize(texture_cube_map_array, glsl_type::ivec3_type, glsl_type::isamplerCubeArray_type),
1000 _textureSize(texture_cube_map_array, glsl_type::ivec3_type, glsl_type::usamplerCubeArray_type),
1001 _textureSize(texture_cube_map_array, glsl_type::ivec3_type, glsl_type::samplerCubeArrayShadow_type),
1002
1003 _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler2DRect_type),
1004 _textureSize(v130, glsl_type::ivec2_type, glsl_type::isampler2DRect_type),
1005 _textureSize(v130, glsl_type::ivec2_type, glsl_type::usampler2DRect_type),
1006 _textureSize(v130, glsl_type::ivec2_type, glsl_type::sampler2DRectShadow_type),
1007
1008 _textureSize(v140, glsl_type::int_type, glsl_type::samplerBuffer_type),
1009 _textureSize(v140, glsl_type::int_type, glsl_type::isamplerBuffer_type),
1010 _textureSize(v140, glsl_type::int_type, glsl_type::usamplerBuffer_type),
1011 _textureSize(texture_multisample, glsl_type::ivec2_type, glsl_type::sampler2DMS_type),
1012 _textureSize(texture_multisample, glsl_type::ivec2_type, glsl_type::isampler2DMS_type),
1013 _textureSize(texture_multisample, glsl_type::ivec2_type, glsl_type::usampler2DMS_type),
1014
1015 _textureSize(texture_multisample, glsl_type::ivec3_type, glsl_type::sampler2DMSArray_type),
1016 _textureSize(texture_multisample, glsl_type::ivec3_type, glsl_type::isampler2DMSArray_type),
1017 _textureSize(texture_multisample, glsl_type::ivec3_type, glsl_type::usampler2DMSArray_type),
1018 NULL);
1019
1020 add_function("texture",
1021 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
1022 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type),
1023 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type),
1024
1025 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
1026 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type),
1027 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type),
1028
1029 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
1030 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type),
1031 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type),
1032
1033 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
1034 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type),
1035 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type),
1036
1037 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
1038 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
1039 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::samplerCubeShadow_type, glsl_type::vec4_type),
1040
1041 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type),
1042 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type),
1043 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type),
1044
1045 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
1046 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type),
1047 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type),
1048
1049 _texture(ir_tex, texture_cube_map_array, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type),
1050 _texture(ir_tex, texture_cube_map_array, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type),
1051 _texture(ir_tex, texture_cube_map_array, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type),
1052
1053 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type),
1054 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type),
1055 /* samplerCubeArrayShadow is special; it has an extra parameter
1056 * for the shadow comparitor since there is no vec5 type.
1057 */
1058 _textureCubeArrayShadow(),
1059
1060 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type),
1061 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type),
1062 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type),
1063
1064 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type),
1065
1066 _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
1067 _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type),
1068 _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type),
1069
1070 _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
1071 _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type),
1072 _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type),
1073
1074 _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
1075 _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type),
1076 _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type),
1077
1078 _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
1079 _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type),
1080 _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type),
1081
1082 _texture(ir_txb, v130_fs_only, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
1083 _texture(ir_txb, v130_fs_only, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
1084 _texture(ir_txb, v130_fs_only, glsl_type::float_type, glsl_type::samplerCubeShadow_type, glsl_type::vec4_type),
1085
1086 _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type),
1087 _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type),
1088 _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type),
1089
1090 _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
1091 _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type),
1092 _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type),
1093
1094 _texture(ir_txb, fs_texture_cube_map_array, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type),
1095 _texture(ir_txb, fs_texture_cube_map_array, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type),
1096 _texture(ir_txb, fs_texture_cube_map_array, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type),
1097
1098 _texture(ir_txb, v130_fs_only, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type),
1099 NULL);
1100
1101 add_function("textureLod",
1102 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
1103 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type),
1104 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type),
1105
1106 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
1107 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type),
1108 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type),
1109
1110 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
1111 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type),
1112 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type),
1113
1114 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
1115 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type),
1116 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type),
1117
1118 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
1119 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
1120
1121 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type),
1122 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type),
1123 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type),
1124
1125 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
1126 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type),
1127 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type),
1128
1129 _texture(ir_txl, texture_cube_map_array, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type),
1130 _texture(ir_txl, texture_cube_map_array, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type),
1131 _texture(ir_txl, texture_cube_map_array, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type),
1132
1133 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type),
1134 NULL);
1135
1136 add_function("textureOffset",
1137 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET),
1138 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET),
1139 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET),
1140
1141 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
1142 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
1143 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
1144
1145 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
1146 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
1147 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
1148
1149 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
1150 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
1151 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
1152
1153 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type, TEX_OFFSET),
1154
1155 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
1156 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
1157
1158 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
1159 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
1160 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
1161
1162 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
1163 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
1164 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
1165
1166 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET),
1167
1168 _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET),
1169 _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET),
1170 _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET),
1171
1172 _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
1173 _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
1174 _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
1175
1176 _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
1177 _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
1178 _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
1179
1180 _texture(ir_txb, v130_fs_only, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
1181 _texture(ir_txb, v130_fs_only, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
1182
1183 _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
1184 _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
1185 _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
1186
1187 _texture(ir_txb, v130_fs_only, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
1188 _texture(ir_txb, v130_fs_only, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
1189 _texture(ir_txb, v130_fs_only, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
1190
1191 _texture(ir_txb, v130_fs_only, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET),
1192 NULL);
1193
1194 add_function("textureProj",
1195 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1196 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1197 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1198 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1199 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1200 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1201
1202 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1203 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1204 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1205 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1206 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1207 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1208
1209 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1210 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1211 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1212
1213 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1214 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1215
1216 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
1217 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
1218 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
1219 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
1220 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
1221 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
1222
1223 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1224
1225 _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1226 _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1227 _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1228 _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1229 _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1230 _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1231
1232 _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1233 _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1234 _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1235 _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1236 _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1237 _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1238
1239 _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1240 _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1241 _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1242
1243 _texture(ir_txb, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1244 _texture(ir_txb, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1245 NULL);
1246
1247 add_function("texelFetch",
1248 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::int_type),
1249 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::int_type),
1250 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::int_type),
1251
1252 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::ivec2_type),
1253 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::ivec2_type),
1254 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::ivec2_type),
1255
1256 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::ivec3_type),
1257 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::ivec3_type),
1258 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::ivec3_type),
1259
1260 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::ivec2_type),
1261 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::ivec2_type),
1262 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::ivec2_type),
1263
1264 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::ivec2_type),
1265 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::ivec2_type),
1266 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::ivec2_type),
1267
1268 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::ivec3_type),
1269 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::ivec3_type),
1270 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::ivec3_type),
1271
1272 _texelFetch(v140, glsl_type::vec4_type, glsl_type::samplerBuffer_type, glsl_type::int_type),
1273 _texelFetch(v140, glsl_type::ivec4_type, glsl_type::isamplerBuffer_type, glsl_type::int_type),
1274 _texelFetch(v140, glsl_type::uvec4_type, glsl_type::usamplerBuffer_type, glsl_type::int_type),
1275
1276 _texelFetch(texture_multisample, glsl_type::vec4_type, glsl_type::sampler2DMS_type, glsl_type::ivec2_type),
1277 _texelFetch(texture_multisample, glsl_type::ivec4_type, glsl_type::isampler2DMS_type, glsl_type::ivec2_type),
1278 _texelFetch(texture_multisample, glsl_type::uvec4_type, glsl_type::usampler2DMS_type, glsl_type::ivec2_type),
1279
1280 _texelFetch(texture_multisample, glsl_type::vec4_type, glsl_type::sampler2DMSArray_type, glsl_type::ivec3_type),
1281 _texelFetch(texture_multisample, glsl_type::ivec4_type, glsl_type::isampler2DMSArray_type, glsl_type::ivec3_type),
1282 _texelFetch(texture_multisample, glsl_type::uvec4_type, glsl_type::usampler2DMSArray_type, glsl_type::ivec3_type),
1283 NULL);
1284
1285 add_function("texelFetchOffset",
1286 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::int_type, glsl_type::int_type),
1287 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::int_type, glsl_type::int_type),
1288 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::int_type, glsl_type::int_type),
1289
1290 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
1291 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
1292 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
1293
1294 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::ivec3_type, glsl_type::ivec3_type),
1295 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::ivec3_type, glsl_type::ivec3_type),
1296 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::ivec3_type, glsl_type::ivec3_type),
1297
1298 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
1299 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
1300 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::ivec2_type, glsl_type::ivec2_type),
1301
1302 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::ivec2_type, glsl_type::int_type),
1303 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::ivec2_type, glsl_type::int_type),
1304 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::ivec2_type, glsl_type::int_type),
1305
1306 _texelFetch(v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::ivec3_type, glsl_type::ivec2_type),
1307 _texelFetch(v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::ivec3_type, glsl_type::ivec2_type),
1308 _texelFetch(v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::ivec3_type, glsl_type::ivec2_type),
1309
1310 NULL);
1311
1312 add_function("textureProjOffset",
1313 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
1314 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
1315 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
1316 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1317 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1318 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1319
1320 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1321 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1322 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1323 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1324 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1325 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1326
1327 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1328 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1329 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1330
1331 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1332 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1333
1334 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1335 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1336 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1337 _texture(ir_tex, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1338 _texture(ir_tex, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1339 _texture(ir_tex, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1340
1341 _texture(ir_tex, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1342
1343 _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
1344 _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
1345 _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
1346 _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1347 _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1348 _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1349
1350 _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1351 _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1352 _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1353 _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1354 _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1355 _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1356
1357 _texture(ir_txb, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1358 _texture(ir_txb, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1359 _texture(ir_txb, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1360
1361 _texture(ir_txb, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1362 _texture(ir_txb, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1363 NULL);
1364
1365 add_function("textureLodOffset",
1366 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET),
1367 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET),
1368 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET),
1369
1370 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
1371 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
1372 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
1373
1374 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
1375 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
1376 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
1377
1378 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
1379 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
1380
1381 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
1382 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
1383 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
1384
1385 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
1386 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
1387 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
1388
1389 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET),
1390 NULL);
1391
1392 add_function("textureProjLod",
1393 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1394 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1395 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1396 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1397 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1398 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1399
1400 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1401 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1402 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1403 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1404 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1405 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1406
1407 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1408 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1409 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1410
1411 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1412 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1413 NULL);
1414
1415 add_function("textureProjLodOffset",
1416 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
1417 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
1418 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
1419 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1420 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1421 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1422
1423 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1424 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1425 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1426 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1427 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1428 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1429
1430 _texture(ir_txl, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1431 _texture(ir_txl, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1432 _texture(ir_txl, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1433
1434 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1435 _texture(ir_txl, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1436 NULL);
1437
1438 add_function("textureGrad",
1439 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
1440 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type),
1441 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type),
1442
1443 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
1444 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type),
1445 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type),
1446
1447 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
1448 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type),
1449 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type),
1450
1451 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
1452 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type),
1453 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type),
1454
1455 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type),
1456 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type),
1457 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type),
1458
1459 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type),
1460
1461 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
1462 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
1463 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::samplerCubeShadow_type, glsl_type::vec4_type),
1464
1465 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type),
1466 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type),
1467 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type),
1468
1469 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
1470 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type),
1471 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type),
1472
1473 _texture(ir_txd, texture_cube_map_array, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type),
1474 _texture(ir_txd, texture_cube_map_array, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type),
1475 _texture(ir_txd, texture_cube_map_array, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type),
1476
1477 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type),
1478 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type),
1479 NULL);
1480
1481 add_function("textureGradOffset",
1482 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type, TEX_OFFSET),
1483 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::float_type, TEX_OFFSET),
1484 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::float_type, TEX_OFFSET),
1485
1486 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
1487 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
1488 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
1489
1490 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
1491 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
1492 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec3_type, TEX_OFFSET),
1493
1494 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
1495 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
1496 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_OFFSET),
1497
1498 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type, TEX_OFFSET),
1499
1500 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
1501 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type, TEX_OFFSET),
1502
1503 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
1504 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
1505 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1DArray_type, glsl_type::vec2_type, TEX_OFFSET),
1506
1507 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
1508 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
1509 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
1510
1511 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type, TEX_OFFSET),
1512 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type, TEX_OFFSET),
1513 NULL);
1514
1515 add_function("textureProjGrad",
1516 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1517 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1518 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1519 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1520 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1521 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1522
1523 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1524 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1525 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1526 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1527 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1528 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1529
1530 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1531 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1532 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1533
1534 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
1535 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
1536 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
1537 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
1538 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
1539 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
1540
1541 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1542
1543 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1544 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1545 NULL);
1546
1547 add_function("textureProjGradOffset",
1548 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
1549 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
1550 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec2_type, TEX_PROJECT | TEX_OFFSET),
1551 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1552 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1553 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler1D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1554
1555 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1556 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1557 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1558 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1559 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1560 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1561
1562 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1563 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1564 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler3D_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1565
1566 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1567 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1568 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT | TEX_OFFSET),
1569 _texture(ir_txd, v130, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1570 _texture(ir_txd, v130, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1571 _texture(ir_txd, v130, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1572
1573 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1574
1575 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1576 _texture(ir_txd, v130, glsl_type::float_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT | TEX_OFFSET),
1577 NULL);
1578
1579 add_function("EmitVertex", _EmitVertex(), NULL);
1580 add_function("EndPrimitive", _EndPrimitive(), NULL);
1581
1582 add_function("textureQueryLOD",
1583 _textureQueryLod(glsl_type::sampler1D_type, glsl_type::float_type),
1584 _textureQueryLod(glsl_type::isampler1D_type, glsl_type::float_type),
1585 _textureQueryLod(glsl_type::usampler1D_type, glsl_type::float_type),
1586
1587 _textureQueryLod(glsl_type::sampler2D_type, glsl_type::vec2_type),
1588 _textureQueryLod(glsl_type::isampler2D_type, glsl_type::vec2_type),
1589 _textureQueryLod(glsl_type::usampler2D_type, glsl_type::vec2_type),
1590
1591 _textureQueryLod(glsl_type::sampler3D_type, glsl_type::vec3_type),
1592 _textureQueryLod(glsl_type::isampler3D_type, glsl_type::vec3_type),
1593 _textureQueryLod(glsl_type::usampler3D_type, glsl_type::vec3_type),
1594
1595 _textureQueryLod(glsl_type::samplerCube_type, glsl_type::vec3_type),
1596 _textureQueryLod(glsl_type::isamplerCube_type, glsl_type::vec3_type),
1597 _textureQueryLod(glsl_type::usamplerCube_type, glsl_type::vec3_type),
1598
1599 _textureQueryLod(glsl_type::sampler1DArray_type, glsl_type::float_type),
1600 _textureQueryLod(glsl_type::isampler1DArray_type, glsl_type::float_type),
1601 _textureQueryLod(glsl_type::usampler1DArray_type, glsl_type::float_type),
1602
1603 _textureQueryLod(glsl_type::sampler2DArray_type, glsl_type::vec2_type),
1604 _textureQueryLod(glsl_type::isampler2DArray_type, glsl_type::vec2_type),
1605 _textureQueryLod(glsl_type::usampler2DArray_type, glsl_type::vec2_type),
1606
1607 _textureQueryLod(glsl_type::samplerCubeArray_type, glsl_type::vec3_type),
1608 _textureQueryLod(glsl_type::isamplerCubeArray_type, glsl_type::vec3_type),
1609 _textureQueryLod(glsl_type::usamplerCubeArray_type, glsl_type::vec3_type),
1610
1611 _textureQueryLod(glsl_type::sampler1DShadow_type, glsl_type::float_type),
1612 _textureQueryLod(glsl_type::sampler2DShadow_type, glsl_type::vec2_type),
1613 _textureQueryLod(glsl_type::samplerCubeShadow_type, glsl_type::vec3_type),
1614 _textureQueryLod(glsl_type::sampler1DArrayShadow_type, glsl_type::float_type),
1615 _textureQueryLod(glsl_type::sampler2DArrayShadow_type, glsl_type::vec2_type),
1616 _textureQueryLod(glsl_type::samplerCubeArrayShadow_type, glsl_type::vec3_type),
1617 NULL);
1618
1619 add_function("textureQueryLevels",
1620 _textureQueryLevels(glsl_type::sampler1D_type),
1621 _textureQueryLevels(glsl_type::sampler2D_type),
1622 _textureQueryLevels(glsl_type::sampler3D_type),
1623 _textureQueryLevels(glsl_type::samplerCube_type),
1624 _textureQueryLevels(glsl_type::sampler1DArray_type),
1625 _textureQueryLevels(glsl_type::sampler2DArray_type),
1626 _textureQueryLevels(glsl_type::samplerCubeArray_type),
1627 _textureQueryLevels(glsl_type::sampler1DShadow_type),
1628 _textureQueryLevels(glsl_type::sampler2DShadow_type),
1629 _textureQueryLevels(glsl_type::samplerCubeShadow_type),
1630 _textureQueryLevels(glsl_type::sampler1DArrayShadow_type),
1631 _textureQueryLevels(glsl_type::sampler2DArrayShadow_type),
1632 _textureQueryLevels(glsl_type::samplerCubeArrayShadow_type),
1633
1634 _textureQueryLevels(glsl_type::isampler1D_type),
1635 _textureQueryLevels(glsl_type::isampler2D_type),
1636 _textureQueryLevels(glsl_type::isampler3D_type),
1637 _textureQueryLevels(glsl_type::isamplerCube_type),
1638 _textureQueryLevels(glsl_type::isampler1DArray_type),
1639 _textureQueryLevels(glsl_type::isampler2DArray_type),
1640 _textureQueryLevels(glsl_type::isamplerCubeArray_type),
1641
1642 _textureQueryLevels(glsl_type::usampler1D_type),
1643 _textureQueryLevels(glsl_type::usampler2D_type),
1644 _textureQueryLevels(glsl_type::usampler3D_type),
1645 _textureQueryLevels(glsl_type::usamplerCube_type),
1646 _textureQueryLevels(glsl_type::usampler1DArray_type),
1647 _textureQueryLevels(glsl_type::usampler2DArray_type),
1648 _textureQueryLevels(glsl_type::usamplerCubeArray_type),
1649
1650 NULL);
1651
1652 add_function("texture1D",
1653 _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
1654 _texture(ir_txb, v110_fs_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
1655 NULL);
1656
1657 add_function("texture1DArray",
1658 _texture(ir_tex, texture_array, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type),
1659 _texture(ir_txb, fs_texture_array, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type),
1660 NULL);
1661
1662 add_function("texture1DProj",
1663 _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1664 _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1665 _texture(ir_txb, v110_fs_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1666 _texture(ir_txb, v110_fs_only, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1667 NULL);
1668
1669 add_function("texture1DLod",
1670 _texture(ir_txl, tex1d_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
1671 NULL);
1672
1673 add_function("texture1DArrayLod",
1674 _texture(ir_txl, texture_array_lod, glsl_type::vec4_type, glsl_type::sampler1DArray_type, glsl_type::vec2_type),
1675 NULL);
1676
1677 add_function("texture1DProjLod",
1678 _texture(ir_txl, tex1d_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1679 _texture(ir_txl, tex1d_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1680 NULL);
1681
1682 add_function("texture2D",
1683 _texture(ir_tex, always_available, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
1684 _texture(ir_txb, fs_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
1685 _texture(ir_tex, texture_external, glsl_type::vec4_type, glsl_type::samplerExternalOES_type, glsl_type::vec2_type),
1686 NULL);
1687
1688 add_function("texture2DArray",
1689 _texture(ir_tex, texture_array, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
1690 _texture(ir_txb, fs_texture_array, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
1691 NULL);
1692
1693 add_function("texture2DProj",
1694 _texture(ir_tex, always_available, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1695 _texture(ir_tex, always_available, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1696 _texture(ir_txb, fs_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1697 _texture(ir_txb, fs_only, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1698 _texture(ir_tex, texture_external, glsl_type::vec4_type, glsl_type::samplerExternalOES_type, glsl_type::vec3_type, TEX_PROJECT),
1699 _texture(ir_tex, texture_external, glsl_type::vec4_type, glsl_type::samplerExternalOES_type, glsl_type::vec4_type, TEX_PROJECT),
1700 NULL);
1701
1702 add_function("texture2DLod",
1703 _texture(ir_txl, lod_exists_in_stage, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
1704 NULL);
1705
1706 add_function("texture2DArrayLod",
1707 _texture(ir_txl, texture_array_lod, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
1708 NULL);
1709
1710 add_function("texture2DProjLod",
1711 _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1712 _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1713 NULL);
1714
1715 add_function("texture3D",
1716 _texture(ir_tex, tex3d, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
1717 _texture(ir_txb, fs_tex3d, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
1718 NULL);
1719
1720 add_function("texture3DProj",
1721 _texture(ir_tex, tex3d, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1722 _texture(ir_txb, fs_tex3d, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1723 NULL);
1724
1725 add_function("texture3DLod",
1726 _texture(ir_txl, tex3d_lod, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
1727 NULL);
1728
1729 add_function("texture3DProjLod",
1730 _texture(ir_txl, tex3d_lod, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1731 NULL);
1732
1733 add_function("textureCube",
1734 _texture(ir_tex, always_available, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
1735 _texture(ir_txb, fs_only, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
1736 NULL);
1737
1738 add_function("textureCubeLod",
1739 _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
1740 NULL);
1741
1742 add_function("texture2DRect",
1743 _texture(ir_tex, texture_rectangle, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type),
1744 NULL);
1745
1746 add_function("texture2DRectProj",
1747 _texture(ir_tex, texture_rectangle, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
1748 _texture(ir_tex, texture_rectangle, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
1749 NULL);
1750
1751 add_function("shadow1D",
1752 _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
1753 _texture(ir_txb, v110_fs_only, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
1754 NULL);
1755
1756 add_function("shadow1DArray",
1757 _texture(ir_tex, texture_array, glsl_type::vec4_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type),
1758 _texture(ir_txb, fs_texture_array, glsl_type::vec4_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type),
1759 NULL);
1760
1761 add_function("shadow2D",
1762 _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
1763 _texture(ir_txb, v110_fs_only, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
1764 NULL);
1765
1766 add_function("shadow2DArray",
1767 _texture(ir_tex, texture_array, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type),
1768 _texture(ir_txb, fs_texture_array, glsl_type::vec4_type, glsl_type::sampler2DArrayShadow_type, glsl_type::vec4_type),
1769 NULL);
1770
1771 add_function("shadow1DProj",
1772 _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1773 _texture(ir_txb, v110_fs_only, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1774 NULL);
1775
1776 add_function("shadow2DProj",
1777 _texture(ir_tex, v110, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1778 _texture(ir_txb, v110_fs_only, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1779 NULL);
1780
1781 add_function("shadow1DLod",
1782 _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
1783 NULL);
1784
1785 add_function("shadow2DLod",
1786 _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
1787 NULL);
1788
1789 add_function("shadow1DArrayLod",
1790 _texture(ir_txl, texture_array_lod, glsl_type::vec4_type, glsl_type::sampler1DArrayShadow_type, glsl_type::vec3_type),
1791 NULL);
1792
1793 add_function("shadow1DProjLod",
1794 _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1795 NULL);
1796
1797 add_function("shadow2DProjLod",
1798 _texture(ir_txl, v110_lod, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1799 NULL);
1800
1801 add_function("shadow2DRect",
1802 _texture(ir_tex, texture_rectangle, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type),
1803 NULL);
1804
1805 add_function("shadow2DRectProj",
1806 _texture(ir_tex, texture_rectangle, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1807 NULL);
1808
1809 add_function("texture1DGradARB",
1810 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::float_type),
1811 NULL);
1812
1813 add_function("texture1DProjGradARB",
1814 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec2_type, TEX_PROJECT),
1815 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler1D_type, glsl_type::vec4_type, TEX_PROJECT),
1816 NULL);
1817
1818 add_function("texture2DGradARB",
1819 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
1820 NULL);
1821
1822 add_function("texture2DProjGradARB",
1823 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec3_type, TEX_PROJECT),
1824 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec4_type, TEX_PROJECT),
1825 NULL);
1826
1827 add_function("texture3DGradARB",
1828 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec3_type),
1829 NULL);
1830
1831 add_function("texture3DProjGradARB",
1832 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler3D_type, glsl_type::vec4_type, TEX_PROJECT),
1833 NULL);
1834
1835 add_function("textureCubeGradARB",
1836 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
1837 NULL);
1838
1839 add_function("shadow1DGradARB",
1840 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec3_type),
1841 NULL);
1842
1843 add_function("shadow1DProjGradARB",
1844 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler1DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1845 NULL);
1846
1847 add_function("shadow2DGradARB",
1848 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec3_type),
1849 NULL);
1850
1851 add_function("shadow2DProjGradARB",
1852 _texture(ir_txd, shader_texture_lod, glsl_type::vec4_type, glsl_type::sampler2DShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1853 NULL);
1854
1855 add_function("texture2DRectGradARB",
1856 _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type),
1857 NULL);
1858
1859 add_function("texture2DRectProjGradARB",
1860 _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec3_type, TEX_PROJECT),
1861 _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec4_type, TEX_PROJECT),
1862 NULL);
1863
1864 add_function("shadow2DRectGradARB",
1865 _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec3_type),
1866 NULL);
1867
1868 add_function("shadow2DRectProjGradARB",
1869 _texture(ir_txd, shader_texture_lod_and_rect, glsl_type::vec4_type, glsl_type::sampler2DRectShadow_type, glsl_type::vec4_type, TEX_PROJECT),
1870 NULL);
1871
1872 add_function("textureGather",
1873 _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type),
1874 _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type),
1875 _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type),
1876
1877 _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type),
1878 _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type),
1879 _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type),
1880
1881 _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type),
1882 _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type),
1883 _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type),
1884
1885 _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type),
1886 _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type),
1887 _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type),
1888
1889 _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type),
1890 _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type),
1891 _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type),
1892
1893 _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_COMPONENT),
1894 _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_COMPONENT),
1895 _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_COMPONENT),
1896
1897 _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DRect_type, glsl_type::vec2_type, TEX_COMPONENT),
1898 _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DRect_type, glsl_type::vec2_type, TEX_COMPONENT),
1899 _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DRect_type, glsl_type::vec2_type, TEX_COMPONENT),
1900
1901 _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_COMPONENT),
1902 _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_COMPONENT),
1903 _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_COMPONENT),
1904
1905 _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::samplerCube_type, glsl_type::vec3_type, TEX_COMPONENT),
1906 _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isamplerCube_type, glsl_type::vec3_type, TEX_COMPONENT),
1907 _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usamplerCube_type, glsl_type::vec3_type, TEX_COMPONENT),
1908
1909 _texture(ir_tg4, gpu_shader5, glsl_type::vec4_type, glsl_type::samplerCubeArray_type, glsl_type::vec4_type, TEX_COMPONENT),
1910 _texture(ir_tg4, gpu_shader5, glsl_type::ivec4_type, glsl_type::isamplerCubeArray_type, glsl_type::vec4_type, TEX_COMPONENT),
1911 _texture(ir_tg4, gpu_shader5, glsl_type::uvec4_type, glsl_type::usamplerCubeArray_type, glsl_type::vec4_type, TEX_COMPONENT),
1912 NULL);
1913
1914 add_function("textureGatherOffset",
1915 _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::sampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
1916 _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
1917 _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usampler2D_type, glsl_type::vec2_type, TEX_OFFSET),
1918
1919 _texture(ir_tg4, texture_gather, glsl_type::vec4_type, glsl_type::sampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
1920 _texture(ir_tg4, texture_gather, glsl_type::ivec4_type, glsl_type::isampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
1921 _texture(ir_tg4, texture_gather, glsl_type::uvec4_type, glsl_type::usampler2DArray_type, glsl_type::vec3_type, TEX_OFFSET),
1922 NULL);
1923
1924 F(dFdx)
1925 F(dFdy)
1926 F(fwidth)
1927 F(noise1)
1928 F(noise2)
1929 F(noise3)
1930 F(noise4)
1931
1932 IU(bitfieldExtract)
1933 IU(bitfieldInsert)
1934 IU(bitfieldReverse)
1935 IU(bitCount)
1936 IU(findLSB)
1937 IU(findMSB)
1938 F(fma)
1939
1940 add_function("ldexp",
1941 _ldexp(glsl_type::float_type, glsl_type::int_type),
1942 _ldexp(glsl_type::vec2_type, glsl_type::ivec2_type),
1943 _ldexp(glsl_type::vec3_type, glsl_type::ivec3_type),
1944 _ldexp(glsl_type::vec4_type, glsl_type::ivec4_type),
1945 NULL);
1946
1947 add_function("frexp",
1948 _frexp(glsl_type::float_type, glsl_type::int_type),
1949 _frexp(glsl_type::vec2_type, glsl_type::ivec2_type),
1950 _frexp(glsl_type::vec3_type, glsl_type::ivec3_type),
1951 _frexp(glsl_type::vec4_type, glsl_type::ivec4_type),
1952 NULL);
1953 add_function("uaddCarry",
1954 _uaddCarry(glsl_type::uint_type),
1955 _uaddCarry(glsl_type::uvec2_type),
1956 _uaddCarry(glsl_type::uvec3_type),
1957 _uaddCarry(glsl_type::uvec4_type),
1958 NULL);
1959 add_function("usubBorrow",
1960 _usubBorrow(glsl_type::uint_type),
1961 _usubBorrow(glsl_type::uvec2_type),
1962 _usubBorrow(glsl_type::uvec3_type),
1963 _usubBorrow(glsl_type::uvec4_type),
1964 NULL);
1965 add_function("imulExtended",
1966 _mulExtended(glsl_type::int_type),
1967 _mulExtended(glsl_type::ivec2_type),
1968 _mulExtended(glsl_type::ivec3_type),
1969 _mulExtended(glsl_type::ivec4_type),
1970 NULL);
1971 add_function("umulExtended",
1972 _mulExtended(glsl_type::uint_type),
1973 _mulExtended(glsl_type::uvec2_type),
1974 _mulExtended(glsl_type::uvec3_type),
1975 _mulExtended(glsl_type::uvec4_type),
1976 NULL);
1977 #undef F
1978 #undef FI
1979 #undef FIU
1980 #undef FIUB
1981 #undef FIU2_MIXED
1982 }
1983
1984 void
1985 builtin_builder::add_function(const char *name, ...)
1986 {
1987 va_list ap;
1988
1989 ir_function *f = new(mem_ctx) ir_function(name);
1990
1991 va_start(ap, name);
1992 while (true) {
1993 ir_function_signature *sig = va_arg(ap, ir_function_signature *);
1994 if (sig == NULL)
1995 break;
1996
1997 sig->is_defined = true;
1998
1999 if (false) {
2000 exec_list stuff;
2001 stuff.push_tail(sig);
2002 validate_ir_tree(&stuff);
2003 }
2004
2005 f->add_signature(sig);
2006 }
2007 va_end(ap);
2008
2009 shader->symbols->add_function(f);
2010 }
2011
2012 ir_variable *
2013 builtin_builder::in_var(const glsl_type *type, const char *name)
2014 {
2015 return new(mem_ctx) ir_variable(type, name, ir_var_function_in);
2016 }
2017
2018 ir_variable *
2019 builtin_builder::out_var(const glsl_type *type, const char *name)
2020 {
2021 return new(mem_ctx) ir_variable(type, name, ir_var_function_out);
2022 }
2023
2024 ir_constant *
2025 builtin_builder::imm(float f, unsigned vector_elements)
2026 {
2027 return new(mem_ctx) ir_constant(f, vector_elements);
2028 }
2029
2030 ir_constant *
2031 builtin_builder::imm(int i, unsigned vector_elements)
2032 {
2033 return new(mem_ctx) ir_constant(i, vector_elements);
2034 }
2035
2036 ir_constant *
2037 builtin_builder::imm(unsigned u, unsigned vector_elements)
2038 {
2039 return new(mem_ctx) ir_constant(u, vector_elements);
2040 }
2041
2042 ir_constant *
2043 builtin_builder::imm(const glsl_type *type, const ir_constant_data &data)
2044 {
2045 return new(mem_ctx) ir_constant(type, &data);
2046 }
2047
2048 ir_dereference_variable *
2049 builtin_builder::var_ref(ir_variable *var)
2050 {
2051 return new(mem_ctx) ir_dereference_variable(var);
2052 }
2053
2054 ir_dereference_array *
2055 builtin_builder::array_ref(ir_variable *var, int idx)
2056 {
2057 return new(mem_ctx) ir_dereference_array(var, imm(idx));
2058 }
2059
2060 /** Return an element of a matrix */
2061 ir_swizzle *
2062 builtin_builder::matrix_elt(ir_variable *var, int column, int row)
2063 {
2064 return swizzle(array_ref(var, column), row, 1);
2065 }
2066
2067 /**
2068 * Implementations of built-in functions:
2069 * @{
2070 */
2071 ir_function_signature *
2072 builtin_builder::new_sig(const glsl_type *return_type,
2073 builtin_available_predicate avail,
2074 int num_params,
2075 ...)
2076 {
2077 va_list ap;
2078
2079 ir_function_signature *sig =
2080 new(mem_ctx) ir_function_signature(return_type, avail);
2081
2082 exec_list plist;
2083 va_start(ap, num_params);
2084 for (int i = 0; i < num_params; i++) {
2085 plist.push_tail(va_arg(ap, ir_variable *));
2086 }
2087 va_end(ap);
2088
2089 sig->replace_parameters(&plist);
2090 return sig;
2091 }
2092
2093 #define MAKE_SIG(return_type, avail, ...) \
2094 ir_function_signature *sig = \
2095 new_sig(return_type, avail, __VA_ARGS__); \
2096 ir_factory body(&sig->body, mem_ctx);
2097
2098 ir_function_signature *
2099 builtin_builder::unop(builtin_available_predicate avail,
2100 ir_expression_operation opcode,
2101 const glsl_type *return_type,
2102 const glsl_type *param_type)
2103 {
2104 ir_variable *x = in_var(param_type, "x");
2105 MAKE_SIG(return_type, avail, 1, x);
2106 body.emit(ret(expr(opcode, x)));
2107 return sig;
2108 }
2109
2110 #define UNOP(NAME, OPCODE, AVAIL) \
2111 ir_function_signature * \
2112 builtin_builder::_##NAME(const glsl_type *type) \
2113 { \
2114 return unop(&AVAIL, OPCODE, type, type); \
2115 }
2116
2117 ir_function_signature *
2118 builtin_builder::binop(ir_expression_operation opcode,
2119 builtin_available_predicate avail,
2120 const glsl_type *return_type,
2121 const glsl_type *param0_type,
2122 const glsl_type *param1_type)
2123 {
2124 ir_variable *x = in_var(param0_type, "x");
2125 ir_variable *y = in_var(param1_type, "y");
2126 MAKE_SIG(return_type, avail, 2, x, y);
2127 body.emit(ret(expr(opcode, x, y)));
2128 return sig;
2129 }
2130
2131 #define BINOP(NAME, OPCODE, AVAIL) \
2132 ir_function_signature * \
2133 builtin_builder::_##NAME(const glsl_type *return_type, \
2134 const glsl_type *param0_type, \
2135 const glsl_type *param1_type) \
2136 { \
2137 return binop(&AVAIL, OPCODE, return_type, param0_type, param1_type); \
2138 }
2139
2140 /**
2141 * Angle and Trigonometry Functions @{
2142 */
2143
2144 ir_function_signature *
2145 builtin_builder::_radians(const glsl_type *type)
2146 {
2147 ir_variable *degrees = in_var(type, "degrees");
2148 MAKE_SIG(type, always_available, 1, degrees);
2149 body.emit(ret(mul(degrees, imm(0.0174532925f))));
2150 return sig;
2151 }
2152
2153 ir_function_signature *
2154 builtin_builder::_degrees(const glsl_type *type)
2155 {
2156 ir_variable *radians = in_var(type, "radians");
2157 MAKE_SIG(type, always_available, 1, radians);
2158 body.emit(ret(mul(radians, imm(57.29578f))));
2159 return sig;
2160 }
2161
2162 UNOP(sin, ir_unop_sin, always_available)
2163 UNOP(cos, ir_unop_cos, always_available)
2164
2165 ir_function_signature *
2166 builtin_builder::_tan(const glsl_type *type)
2167 {
2168 ir_variable *theta = in_var(type, "theta");
2169 MAKE_SIG(type, always_available, 1, theta);
2170 body.emit(ret(div(sin(theta), cos(theta))));
2171 return sig;
2172 }
2173
2174 ir_expression *
2175 builtin_builder::asin_expr(ir_variable *x)
2176 {
2177 return mul(sign(x),
2178 sub(imm(1.5707964f),
2179 mul(sqrt(sub(imm(1.0f), abs(x))),
2180 add(imm(1.5707964f),
2181 mul(abs(x),
2182 add(imm(-0.21460183f),
2183 mul(abs(x),
2184 add(imm(0.086566724f),
2185 mul(abs(x), imm(-0.03102955f))))))))));
2186 }
2187
2188
2189 ir_function_signature *
2190 builtin_builder::_asin(const glsl_type *type)
2191 {
2192 ir_variable *x = in_var(type, "x");
2193 MAKE_SIG(type, always_available, 1, x);
2194
2195 body.emit(ret(asin_expr(x)));
2196
2197 return sig;
2198 }
2199
2200 ir_function_signature *
2201 builtin_builder::_acos(const glsl_type *type)
2202 {
2203 ir_variable *x = in_var(type, "x");
2204 MAKE_SIG(type, always_available, 1, x);
2205
2206 body.emit(ret(sub(imm(1.5707964f), asin_expr(x))));
2207
2208 return sig;
2209 }
2210
2211 ir_function_signature *
2212 builtin_builder::_atan2(const glsl_type *type)
2213 {
2214 ir_variable *vec_y = in_var(type, "vec_y");
2215 ir_variable *vec_x = in_var(type, "vec_x");
2216 MAKE_SIG(type, always_available, 2, vec_y, vec_x);
2217
2218 ir_variable *vec_result = body.make_temp(type, "vec_result");
2219 ir_variable *r = body.make_temp(glsl_type::float_type, "r");
2220 for (int i = 0; i < type->vector_elements; i++) {
2221 ir_variable *y = body.make_temp(glsl_type::float_type, "y");
2222 ir_variable *x = body.make_temp(glsl_type::float_type, "x");
2223 body.emit(assign(y, swizzle(vec_y, i, 1)));
2224 body.emit(assign(x, swizzle(vec_x, i, 1)));
2225
2226 /* If |x| >= 1.0e-8 * |y|: */
2227 ir_if *outer_if =
2228 new(mem_ctx) ir_if(greater(abs(x), mul(imm(1.0e-8f), abs(y))));
2229
2230 ir_factory outer_then(&outer_if->then_instructions, mem_ctx);
2231
2232 /* Then...call atan(y/x) */
2233 ir_variable *y_over_x = outer_then.make_temp(glsl_type::float_type, "y_over_x");
2234 outer_then.emit(assign(y_over_x, div(y, x)));
2235 outer_then.emit(assign(r, mul(y_over_x, rsq(add(mul(y_over_x, y_over_x),
2236 imm(1.0f))))));
2237 outer_then.emit(assign(r, asin_expr(r)));
2238
2239 /* ...and fix it up: */
2240 ir_if *inner_if = new(mem_ctx) ir_if(less(x, imm(0.0f)));
2241 inner_if->then_instructions.push_tail(
2242 if_tree(gequal(y, imm(0.0f)),
2243 assign(r, add(r, imm(3.141593f))),
2244 assign(r, sub(r, imm(3.141593f)))));
2245 outer_then.emit(inner_if);
2246
2247 /* Else... */
2248 outer_if->else_instructions.push_tail(
2249 assign(r, mul(sign(y), imm(1.5707965f))));
2250
2251 body.emit(outer_if);
2252
2253 body.emit(assign(vec_result, r, 1 << i));
2254 }
2255 body.emit(ret(vec_result));
2256
2257 return sig;
2258 }
2259
2260 ir_function_signature *
2261 builtin_builder::_atan(const glsl_type *type)
2262 {
2263 ir_variable *y_over_x = in_var(type, "y_over_x");
2264 MAKE_SIG(type, always_available, 1, y_over_x);
2265
2266 ir_variable *t = body.make_temp(type, "t");
2267 body.emit(assign(t, mul(y_over_x, rsq(add(mul(y_over_x, y_over_x),
2268 imm(1.0f))))));
2269
2270 body.emit(ret(asin_expr(t)));
2271
2272 return sig;
2273 }
2274
2275 ir_function_signature *
2276 builtin_builder::_sinh(const glsl_type *type)
2277 {
2278 ir_variable *x = in_var(type, "x");
2279 MAKE_SIG(type, v130, 1, x);
2280
2281 /* 0.5 * (e^x - e^(-x)) */
2282 body.emit(ret(mul(imm(0.5f), sub(exp(x), exp(neg(x))))));
2283
2284 return sig;
2285 }
2286
2287 ir_function_signature *
2288 builtin_builder::_cosh(const glsl_type *type)
2289 {
2290 ir_variable *x = in_var(type, "x");
2291 MAKE_SIG(type, v130, 1, x);
2292
2293 /* 0.5 * (e^x + e^(-x)) */
2294 body.emit(ret(mul(imm(0.5f), add(exp(x), exp(neg(x))))));
2295
2296 return sig;
2297 }
2298
2299 ir_function_signature *
2300 builtin_builder::_tanh(const glsl_type *type)
2301 {
2302 ir_variable *x = in_var(type, "x");
2303 MAKE_SIG(type, v130, 1, x);
2304
2305 /* (e^x - e^(-x)) / (e^x + e^(-x)) */
2306 body.emit(ret(div(sub(exp(x), exp(neg(x))),
2307 add(exp(x), exp(neg(x))))));
2308
2309 return sig;
2310 }
2311
2312 ir_function_signature *
2313 builtin_builder::_asinh(const glsl_type *type)
2314 {
2315 ir_variable *x = in_var(type, "x");
2316 MAKE_SIG(type, v130, 1, x);
2317
2318 body.emit(ret(mul(sign(x), log(add(abs(x), sqrt(add(mul(x, x),
2319 imm(1.0f))))))));
2320 return sig;
2321 }
2322
2323 ir_function_signature *
2324 builtin_builder::_acosh(const glsl_type *type)
2325 {
2326 ir_variable *x = in_var(type, "x");
2327 MAKE_SIG(type, v130, 1, x);
2328
2329 body.emit(ret(log(add(x, sqrt(sub(mul(x, x), imm(1.0f)))))));
2330 return sig;
2331 }
2332
2333 ir_function_signature *
2334 builtin_builder::_atanh(const glsl_type *type)
2335 {
2336 ir_variable *x = in_var(type, "x");
2337 MAKE_SIG(type, v130, 1, x);
2338
2339 body.emit(ret(mul(imm(0.5f), log(div(add(imm(1.0f), x),
2340 sub(imm(1.0f), x))))));
2341 return sig;
2342 }
2343 /** @} */
2344
2345 /**
2346 * Exponential Functions @{
2347 */
2348
2349 ir_function_signature *
2350 builtin_builder::_pow(const glsl_type *type)
2351 {
2352 return binop(ir_binop_pow, always_available, type, type, type);
2353 }
2354
2355 UNOP(exp, ir_unop_exp, always_available)
2356 UNOP(log, ir_unop_log, always_available)
2357 UNOP(exp2, ir_unop_exp2, always_available)
2358 UNOP(log2, ir_unop_log2, always_available)
2359 UNOP(sqrt, ir_unop_sqrt, always_available)
2360 UNOP(inversesqrt, ir_unop_rsq, always_available)
2361
2362 /** @} */
2363
2364 UNOP(abs, ir_unop_abs, always_available)
2365 UNOP(sign, ir_unop_sign, always_available)
2366 UNOP(floor, ir_unop_floor, always_available)
2367 UNOP(trunc, ir_unop_trunc, v130)
2368 UNOP(round, ir_unop_round_even, always_available)
2369 UNOP(roundEven, ir_unop_round_even, always_available)
2370 UNOP(ceil, ir_unop_ceil, always_available)
2371 UNOP(fract, ir_unop_fract, always_available)
2372
2373 ir_function_signature *
2374 builtin_builder::_mod(const glsl_type *x_type, const glsl_type *y_type)
2375 {
2376 return binop(ir_binop_mod, always_available, x_type, x_type, y_type);
2377 }
2378
2379 ir_function_signature *
2380 builtin_builder::_modf(const glsl_type *type)
2381 {
2382 ir_variable *x = in_var(type, "x");
2383 ir_variable *i = out_var(type, "i");
2384 MAKE_SIG(type, v130, 2, x, i);
2385
2386 ir_variable *t = body.make_temp(type, "t");
2387 body.emit(assign(t, expr(ir_unop_trunc, x)));
2388 body.emit(assign(i, t));
2389 body.emit(ret(sub(x, t)));
2390
2391 return sig;
2392 }
2393
2394 ir_function_signature *
2395 builtin_builder::_min(builtin_available_predicate avail,
2396 const glsl_type *x_type, const glsl_type *y_type)
2397 {
2398 return binop(ir_binop_min, avail, x_type, x_type, y_type);
2399 }
2400
2401 ir_function_signature *
2402 builtin_builder::_max(builtin_available_predicate avail,
2403 const glsl_type *x_type, const glsl_type *y_type)
2404 {
2405 return binop(ir_binop_max, avail, x_type, x_type, y_type);
2406 }
2407
2408 ir_function_signature *
2409 builtin_builder::_clamp(builtin_available_predicate avail,
2410 const glsl_type *val_type, const glsl_type *bound_type)
2411 {
2412 ir_variable *x = in_var(val_type, "x");
2413 ir_variable *minVal = in_var(bound_type, "minVal");
2414 ir_variable *maxVal = in_var(bound_type, "maxVal");
2415 MAKE_SIG(val_type, avail, 3, x, minVal, maxVal);
2416
2417 body.emit(ret(clamp(x, minVal, maxVal)));
2418
2419 return sig;
2420 }
2421
2422 ir_function_signature *
2423 builtin_builder::_mix_lrp(const glsl_type *val_type, const glsl_type *blend_type)
2424 {
2425 ir_variable *x = in_var(val_type, "x");
2426 ir_variable *y = in_var(val_type, "y");
2427 ir_variable *a = in_var(blend_type, "a");
2428 MAKE_SIG(val_type, always_available, 3, x, y, a);
2429
2430 body.emit(ret(lrp(x, y, a)));
2431
2432 return sig;
2433 }
2434
2435 ir_function_signature *
2436 builtin_builder::_mix_sel(builtin_available_predicate avail,
2437 const glsl_type *val_type,
2438 const glsl_type *blend_type)
2439 {
2440 ir_variable *x = in_var(val_type, "x");
2441 ir_variable *y = in_var(val_type, "y");
2442 ir_variable *a = in_var(blend_type, "a");
2443 MAKE_SIG(val_type, avail, 3, x, y, a);
2444
2445 /* csel matches the ternary operator in that a selector of true choses the
2446 * first argument. This differs from mix(x, y, false) which choses the
2447 * second argument (to remain consistent with the interpolating version of
2448 * mix() which takes a blend factor from 0.0 to 1.0 where 0.0 is only x.
2449 *
2450 * To handle the behavior mismatch, reverse the x and y arguments.
2451 */
2452 body.emit(ret(csel(a, y, x)));
2453
2454 return sig;
2455 }
2456
2457 ir_function_signature *
2458 builtin_builder::_step(const glsl_type *edge_type, const glsl_type *x_type)
2459 {
2460 ir_variable *edge = in_var(edge_type, "edge");
2461 ir_variable *x = in_var(x_type, "x");
2462 MAKE_SIG(x_type, always_available, 2, edge, x);
2463
2464 ir_variable *t = body.make_temp(x_type, "t");
2465 if (x_type->vector_elements == 1) {
2466 /* Both are floats */
2467 body.emit(assign(t, b2f(gequal(x, edge))));
2468 } else if (edge_type->vector_elements == 1) {
2469 /* x is a vector but edge is a float */
2470 for (int i = 0; i < x_type->vector_elements; i++) {
2471 body.emit(assign(t, b2f(gequal(swizzle(x, i, 1), edge)), 1 << i));
2472 }
2473 } else {
2474 /* Both are vectors */
2475 for (int i = 0; i < x_type->vector_elements; i++) {
2476 body.emit(assign(t, b2f(gequal(swizzle(x, i, 1), swizzle(edge, i, 1))),
2477 1 << i));
2478 }
2479 }
2480 body.emit(ret(t));
2481
2482 return sig;
2483 }
2484
2485 ir_function_signature *
2486 builtin_builder::_smoothstep(const glsl_type *edge_type, const glsl_type *x_type)
2487 {
2488 ir_variable *edge0 = in_var(edge_type, "edge0");
2489 ir_variable *edge1 = in_var(edge_type, "edge1");
2490 ir_variable *x = in_var(x_type, "x");
2491 MAKE_SIG(x_type, always_available, 3, edge0, edge1, x);
2492
2493 /* From the GLSL 1.10 specification:
2494 *
2495 * genType t;
2496 * t = clamp((x - edge0) / (edge1 - edge0), 0, 1);
2497 * return t * t * (3 - 2 * t);
2498 */
2499
2500 ir_variable *t = body.make_temp(x_type, "t");
2501 body.emit(assign(t, clamp(div(sub(x, edge0), sub(edge1, edge0)),
2502 imm(0.0f), imm(1.0f))));
2503
2504 body.emit(ret(mul(t, mul(t, sub(imm(3.0f), mul(imm(2.0f), t))))));
2505
2506 return sig;
2507 }
2508
2509 ir_function_signature *
2510 builtin_builder::_isnan(const glsl_type *type)
2511 {
2512 ir_variable *x = in_var(type, "x");
2513 MAKE_SIG(glsl_type::bvec(type->vector_elements), v130, 1, x);
2514
2515 body.emit(ret(nequal(x, x)));
2516
2517 return sig;
2518 }
2519
2520 ir_function_signature *
2521 builtin_builder::_isinf(const glsl_type *type)
2522 {
2523 ir_variable *x = in_var(type, "x");
2524 MAKE_SIG(glsl_type::bvec(type->vector_elements), v130, 1, x);
2525
2526 ir_constant_data infinities;
2527 for (int i = 0; i < type->vector_elements; i++) {
2528 infinities.f[i] = std::numeric_limits<float>::infinity();
2529 }
2530
2531 body.emit(ret(equal(abs(x), imm(type, infinities))));
2532
2533 return sig;
2534 }
2535
2536 ir_function_signature *
2537 builtin_builder::_floatBitsToInt(const glsl_type *type)
2538 {
2539 ir_variable *x = in_var(type, "x");
2540 MAKE_SIG(glsl_type::ivec(type->vector_elements), shader_bit_encoding, 1, x);
2541 body.emit(ret(bitcast_f2i(x)));
2542 return sig;
2543 }
2544
2545 ir_function_signature *
2546 builtin_builder::_floatBitsToUint(const glsl_type *type)
2547 {
2548 ir_variable *x = in_var(type, "x");
2549 MAKE_SIG(glsl_type::uvec(type->vector_elements), shader_bit_encoding, 1, x);
2550 body.emit(ret(bitcast_f2u(x)));
2551 return sig;
2552 }
2553
2554 ir_function_signature *
2555 builtin_builder::_intBitsToFloat(const glsl_type *type)
2556 {
2557 ir_variable *x = in_var(type, "x");
2558 MAKE_SIG(glsl_type::vec(type->vector_elements), shader_bit_encoding, 1, x);
2559 body.emit(ret(bitcast_i2f(x)));
2560 return sig;
2561 }
2562
2563 ir_function_signature *
2564 builtin_builder::_uintBitsToFloat(const glsl_type *type)
2565 {
2566 ir_variable *x = in_var(type, "x");
2567 MAKE_SIG(glsl_type::vec(type->vector_elements), shader_bit_encoding, 1, x);
2568 body.emit(ret(bitcast_u2f(x)));
2569 return sig;
2570 }
2571
2572 ir_function_signature *
2573 builtin_builder::_packUnorm2x16(builtin_available_predicate avail)
2574 {
2575 ir_variable *v = in_var(glsl_type::vec2_type, "v");
2576 MAKE_SIG(glsl_type::uint_type, avail, 1, v);
2577 body.emit(ret(expr(ir_unop_pack_unorm_2x16, v)));
2578 return sig;
2579 }
2580
2581 ir_function_signature *
2582 builtin_builder::_packSnorm2x16(builtin_available_predicate avail)
2583 {
2584 ir_variable *v = in_var(glsl_type::vec2_type, "v");
2585 MAKE_SIG(glsl_type::uint_type, avail, 1, v);
2586 body.emit(ret(expr(ir_unop_pack_snorm_2x16, v)));
2587 return sig;
2588 }
2589
2590 ir_function_signature *
2591 builtin_builder::_packUnorm4x8(builtin_available_predicate avail)
2592 {
2593 ir_variable *v = in_var(glsl_type::vec4_type, "v");
2594 MAKE_SIG(glsl_type::uint_type, avail, 1, v);
2595 body.emit(ret(expr(ir_unop_pack_unorm_4x8, v)));
2596 return sig;
2597 }
2598
2599 ir_function_signature *
2600 builtin_builder::_packSnorm4x8(builtin_available_predicate avail)
2601 {
2602 ir_variable *v = in_var(glsl_type::vec4_type, "v");
2603 MAKE_SIG(glsl_type::uint_type, avail, 1, v);
2604 body.emit(ret(expr(ir_unop_pack_snorm_4x8, v)));
2605 return sig;
2606 }
2607
2608 ir_function_signature *
2609 builtin_builder::_unpackUnorm2x16(builtin_available_predicate avail)
2610 {
2611 ir_variable *p = in_var(glsl_type::uint_type, "p");
2612 MAKE_SIG(glsl_type::vec2_type, avail, 1, p);
2613 body.emit(ret(expr(ir_unop_unpack_unorm_2x16, p)));
2614 return sig;
2615 }
2616
2617 ir_function_signature *
2618 builtin_builder::_unpackSnorm2x16(builtin_available_predicate avail)
2619 {
2620 ir_variable *p = in_var(glsl_type::uint_type, "p");
2621 MAKE_SIG(glsl_type::vec2_type, avail, 1, p);
2622 body.emit(ret(expr(ir_unop_unpack_snorm_2x16, p)));
2623 return sig;
2624 }
2625
2626
2627 ir_function_signature *
2628 builtin_builder::_unpackUnorm4x8(builtin_available_predicate avail)
2629 {
2630 ir_variable *p = in_var(glsl_type::uint_type, "p");
2631 MAKE_SIG(glsl_type::vec4_type, avail, 1, p);
2632 body.emit(ret(expr(ir_unop_unpack_unorm_4x8, p)));
2633 return sig;
2634 }
2635
2636 ir_function_signature *
2637 builtin_builder::_unpackSnorm4x8(builtin_available_predicate avail)
2638 {
2639 ir_variable *p = in_var(glsl_type::uint_type, "p");
2640 MAKE_SIG(glsl_type::vec4_type, avail, 1, p);
2641 body.emit(ret(expr(ir_unop_unpack_snorm_4x8, p)));
2642 return sig;
2643 }
2644
2645 ir_function_signature *
2646 builtin_builder::_packHalf2x16(builtin_available_predicate avail)
2647 {
2648 ir_variable *v = in_var(glsl_type::vec2_type, "v");
2649 MAKE_SIG(glsl_type::uint_type, avail, 1, v);
2650 body.emit(ret(expr(ir_unop_pack_half_2x16, v)));
2651 return sig;
2652 }
2653
2654 ir_function_signature *
2655 builtin_builder::_unpackHalf2x16(builtin_available_predicate avail)
2656 {
2657 ir_variable *p = in_var(glsl_type::uint_type, "p");
2658 MAKE_SIG(glsl_type::vec2_type, avail, 1, p);
2659 body.emit(ret(expr(ir_unop_unpack_half_2x16, p)));
2660 return sig;
2661 }
2662
2663 ir_function_signature *
2664 builtin_builder::_length(const glsl_type *type)
2665 {
2666 ir_variable *x = in_var(type, "x");
2667 MAKE_SIG(glsl_type::float_type, always_available, 1, x);
2668
2669 body.emit(ret(sqrt(dotlike(x, x))));
2670
2671 return sig;
2672 }
2673
2674 ir_function_signature *
2675 builtin_builder::_distance(const glsl_type *type)
2676 {
2677 ir_variable *p0 = in_var(type, "p0");
2678 ir_variable *p1 = in_var(type, "p1");
2679 MAKE_SIG(glsl_type::float_type, always_available, 2, p0, p1);
2680
2681 if (type->vector_elements == 1) {
2682 body.emit(ret(abs(sub(p0, p1))));
2683 } else {
2684 ir_variable *p = body.make_temp(type, "p");
2685 body.emit(assign(p, sub(p0, p1)));
2686 body.emit(ret(sqrt(dot(p, p))));
2687 }
2688
2689 return sig;
2690 }
2691
2692 ir_function_signature *
2693 builtin_builder::_dot(const glsl_type *type)
2694 {
2695 if (type->vector_elements == 1)
2696 return binop(ir_binop_mul, always_available, type, type, type);
2697
2698 return binop(ir_binop_dot, always_available,
2699 glsl_type::float_type, type, type);
2700 }
2701
2702 ir_function_signature *
2703 builtin_builder::_cross(const glsl_type *type)
2704 {
2705 ir_variable *a = in_var(type, "a");
2706 ir_variable *b = in_var(type, "b");
2707 MAKE_SIG(type, always_available, 2, a, b);
2708
2709 int yzx = MAKE_SWIZZLE4(SWIZZLE_Y, SWIZZLE_Z, SWIZZLE_X, 0);
2710 int zxy = MAKE_SWIZZLE4(SWIZZLE_Z, SWIZZLE_X, SWIZZLE_Y, 0);
2711
2712 body.emit(ret(sub(mul(swizzle(a, yzx, 3), swizzle(b, zxy, 3)),
2713 mul(swizzle(a, zxy, 3), swizzle(b, yzx, 3)))));
2714
2715 return sig;
2716 }
2717
2718 ir_function_signature *
2719 builtin_builder::_normalize(const glsl_type *type)
2720 {
2721 ir_variable *x = in_var(type, "x");
2722 MAKE_SIG(type, always_available, 1, x);
2723
2724 if (type->vector_elements == 1) {
2725 body.emit(ret(sign(x)));
2726 } else {
2727 body.emit(ret(mul(x, rsq(dot(x, x)))));
2728 }
2729
2730 return sig;
2731 }
2732
2733 ir_function_signature *
2734 builtin_builder::_ftransform()
2735 {
2736 MAKE_SIG(glsl_type::vec4_type, compatibility_vs_only, 0);
2737
2738 body.emit(ret(new(mem_ctx) ir_expression(ir_binop_mul,
2739 glsl_type::vec4_type,
2740 var_ref(gl_ModelViewProjectionMatrix),
2741 var_ref(gl_Vertex))));
2742
2743 /* FINISHME: Once the ir_expression() constructor handles type inference
2744 * for matrix operations, we can simplify this to:
2745 *
2746 * body.emit(ret(mul(gl_ModelViewProjectionMatrix, gl_Vertex)));
2747 */
2748 return sig;
2749 }
2750
2751 ir_function_signature *
2752 builtin_builder::_faceforward(const glsl_type *type)
2753 {
2754 ir_variable *N = in_var(type, "N");
2755 ir_variable *I = in_var(type, "I");
2756 ir_variable *Nref = in_var(type, "Nref");
2757 MAKE_SIG(type, always_available, 3, N, I, Nref);
2758
2759 body.emit(if_tree(less(dotlike(Nref, I), imm(0.0f)),
2760 ret(N), ret(neg(N))));
2761
2762 return sig;
2763 }
2764
2765 ir_function_signature *
2766 builtin_builder::_reflect(const glsl_type *type)
2767 {
2768 ir_variable *I = in_var(type, "I");
2769 ir_variable *N = in_var(type, "N");
2770 MAKE_SIG(type, always_available, 2, I, N);
2771
2772 /* I - 2 * dot(N, I) * N */
2773 body.emit(ret(sub(I, mul(imm(2.0f), mul(dotlike(N, I), N)))));
2774
2775 return sig;
2776 }
2777
2778 ir_function_signature *
2779 builtin_builder::_refract(const glsl_type *type)
2780 {
2781 ir_variable *I = in_var(type, "I");
2782 ir_variable *N = in_var(type, "N");
2783 ir_variable *eta = in_var(glsl_type::float_type, "eta");
2784 MAKE_SIG(type, always_available, 3, I, N, eta);
2785
2786 ir_variable *n_dot_i = body.make_temp(glsl_type::float_type, "n_dot_i");
2787 body.emit(assign(n_dot_i, dotlike(N, I)));
2788
2789 /* From the GLSL 1.10 specification:
2790 * k = 1.0 - eta * eta * (1.0 - dot(N, I) * dot(N, I))
2791 * if (k < 0.0)
2792 * return genType(0.0)
2793 * else
2794 * return eta * I - (eta * dot(N, I) + sqrt(k)) * N
2795 */
2796 ir_variable *k = body.make_temp(glsl_type::float_type, "k");
2797 body.emit(assign(k, sub(imm(1.0f),
2798 mul(eta, mul(eta, sub(imm(1.0f),
2799 mul(n_dot_i, n_dot_i)))))));
2800 body.emit(if_tree(less(k, imm(0.0f)),
2801 ret(ir_constant::zero(mem_ctx, type)),
2802 ret(sub(mul(eta, I),
2803 mul(add(mul(eta, n_dot_i), sqrt(k)), N)))));
2804
2805 return sig;
2806 }
2807
2808 ir_function_signature *
2809 builtin_builder::_matrixCompMult(const glsl_type *type)
2810 {
2811 ir_variable *x = in_var(type, "x");
2812 ir_variable *y = in_var(type, "y");
2813 MAKE_SIG(type, always_available, 2, x, y);
2814
2815 ir_variable *z = body.make_temp(type, "z");
2816 for (int i = 0; i < type->matrix_columns; i++) {
2817 body.emit(assign(array_ref(z, i), mul(array_ref(x, i), array_ref(y, i))));
2818 }
2819 body.emit(ret(z));
2820
2821 return sig;
2822 }
2823
2824 ir_function_signature *
2825 builtin_builder::_outerProduct(const glsl_type *type)
2826 {
2827 ir_variable *c = in_var(glsl_type::vec(type->vector_elements), "c");
2828 ir_variable *r = in_var(glsl_type::vec(type->matrix_columns), "r");
2829 MAKE_SIG(type, v120, 2, c, r);
2830
2831 ir_variable *m = body.make_temp(type, "m");
2832 for (int i = 0; i < type->matrix_columns; i++) {
2833 body.emit(assign(array_ref(m, i), mul(c, swizzle(r, i, 1))));
2834 }
2835 body.emit(ret(m));
2836
2837 return sig;
2838 }
2839
2840 ir_function_signature *
2841 builtin_builder::_transpose(const glsl_type *orig_type)
2842 {
2843 const glsl_type *transpose_type =
2844 glsl_type::get_instance(GLSL_TYPE_FLOAT,
2845 orig_type->matrix_columns,
2846 orig_type->vector_elements);
2847
2848 ir_variable *m = in_var(orig_type, "m");
2849 MAKE_SIG(transpose_type, v120, 1, m);
2850
2851 ir_variable *t = body.make_temp(transpose_type, "t");
2852 for (int i = 0; i < orig_type->matrix_columns; i++) {
2853 for (int j = 0; j < orig_type->vector_elements; j++) {
2854 body.emit(assign(array_ref(t, j),
2855 matrix_elt(m, i, j),
2856 1 << i));
2857 }
2858 }
2859 body.emit(ret(t));
2860
2861 return sig;
2862 }
2863
2864 ir_function_signature *
2865 builtin_builder::_determinant_mat2()
2866 {
2867 ir_variable *m = in_var(glsl_type::mat2_type, "m");
2868 MAKE_SIG(glsl_type::float_type, v120, 1, m);
2869
2870 body.emit(ret(sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 1, 1)),
2871 mul(matrix_elt(m, 1, 0), matrix_elt(m, 0, 1)))));
2872
2873 return sig;
2874 }
2875
2876 ir_function_signature *
2877 builtin_builder::_determinant_mat3()
2878 {
2879 ir_variable *m = in_var(glsl_type::mat3_type, "m");
2880 MAKE_SIG(glsl_type::float_type, v120, 1, m);
2881
2882 ir_expression *f1 =
2883 sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 2)),
2884 mul(matrix_elt(m, 1, 2), matrix_elt(m, 2, 1)));
2885
2886 ir_expression *f2 =
2887 sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 2)),
2888 mul(matrix_elt(m, 1, 2), matrix_elt(m, 2, 0)));
2889
2890 ir_expression *f3 =
2891 sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 1)),
2892 mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 0)));
2893
2894 body.emit(ret(add(sub(mul(matrix_elt(m, 0, 0), f1),
2895 mul(matrix_elt(m, 0, 1), f2)),
2896 mul(matrix_elt(m, 0, 2), f3))));
2897
2898 return sig;
2899 }
2900
2901 ir_function_signature *
2902 builtin_builder::_determinant_mat4()
2903 {
2904 ir_variable *m = in_var(glsl_type::mat4_type, "m");
2905 MAKE_SIG(glsl_type::float_type, v120, 1, m);
2906
2907 ir_variable *SubFactor00 = body.make_temp(glsl_type::float_type, "SubFactor00");
2908 ir_variable *SubFactor01 = body.make_temp(glsl_type::float_type, "SubFactor01");
2909 ir_variable *SubFactor02 = body.make_temp(glsl_type::float_type, "SubFactor02");
2910 ir_variable *SubFactor03 = body.make_temp(glsl_type::float_type, "SubFactor03");
2911 ir_variable *SubFactor04 = body.make_temp(glsl_type::float_type, "SubFactor04");
2912 ir_variable *SubFactor05 = body.make_temp(glsl_type::float_type, "SubFactor05");
2913 ir_variable *SubFactor06 = body.make_temp(glsl_type::float_type, "SubFactor06");
2914 ir_variable *SubFactor07 = body.make_temp(glsl_type::float_type, "SubFactor07");
2915 ir_variable *SubFactor08 = body.make_temp(glsl_type::float_type, "SubFactor08");
2916 ir_variable *SubFactor09 = body.make_temp(glsl_type::float_type, "SubFactor09");
2917 ir_variable *SubFactor10 = body.make_temp(glsl_type::float_type, "SubFactor10");
2918 ir_variable *SubFactor11 = body.make_temp(glsl_type::float_type, "SubFactor11");
2919 ir_variable *SubFactor12 = body.make_temp(glsl_type::float_type, "SubFactor12");
2920 ir_variable *SubFactor13 = body.make_temp(glsl_type::float_type, "SubFactor13");
2921 ir_variable *SubFactor14 = body.make_temp(glsl_type::float_type, "SubFactor14");
2922 ir_variable *SubFactor15 = body.make_temp(glsl_type::float_type, "SubFactor15");
2923 ir_variable *SubFactor16 = body.make_temp(glsl_type::float_type, "SubFactor16");
2924 ir_variable *SubFactor17 = body.make_temp(glsl_type::float_type, "SubFactor17");
2925 ir_variable *SubFactor18 = body.make_temp(glsl_type::float_type, "SubFactor18");
2926
2927 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)))));
2928 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)))));
2929 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)))));
2930 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)))));
2931 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)))));
2932 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)))));
2933 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)))));
2934 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)))));
2935 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)))));
2936 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)))));
2937 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)))));
2938 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)))));
2939 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)))));
2940 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)))));
2941 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)))));
2942 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)))));
2943 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)))));
2944 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)))));
2945 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)))));
2946
2947 ir_variable *adj_0 = body.make_temp(glsl_type::vec4_type, "adj_0");
2948
2949 body.emit(assign(adj_0,
2950 add(sub(mul(matrix_elt(m, 1, 1), SubFactor00),
2951 mul(matrix_elt(m, 1, 2), SubFactor01)),
2952 mul(matrix_elt(m, 1, 3), SubFactor02)),
2953 WRITEMASK_X));
2954 body.emit(assign(adj_0, neg(
2955 add(sub(mul(matrix_elt(m, 1, 0), SubFactor00),
2956 mul(matrix_elt(m, 1, 2), SubFactor03)),
2957 mul(matrix_elt(m, 1, 3), SubFactor04))),
2958 WRITEMASK_Y));
2959 body.emit(assign(adj_0,
2960 add(sub(mul(matrix_elt(m, 1, 0), SubFactor01),
2961 mul(matrix_elt(m, 1, 1), SubFactor03)),
2962 mul(matrix_elt(m, 1, 3), SubFactor05)),
2963 WRITEMASK_Z));
2964 body.emit(assign(adj_0, neg(
2965 add(sub(mul(matrix_elt(m, 1, 0), SubFactor02),
2966 mul(matrix_elt(m, 1, 1), SubFactor04)),
2967 mul(matrix_elt(m, 1, 2), SubFactor05))),
2968 WRITEMASK_W));
2969
2970 body.emit(ret(dot(array_ref(m, 0), adj_0)));
2971
2972 return sig;
2973 }
2974
2975 ir_function_signature *
2976 builtin_builder::_inverse_mat2()
2977 {
2978 ir_variable *m = in_var(glsl_type::mat2_type, "m");
2979 MAKE_SIG(glsl_type::mat2_type, v120, 1, m);
2980
2981 ir_variable *adj = body.make_temp(glsl_type::mat2_type, "adj");
2982 body.emit(assign(array_ref(adj, 0), matrix_elt(m, 1, 1), 1 << 0));
2983 body.emit(assign(array_ref(adj, 0), neg(matrix_elt(m, 0, 1)), 1 << 1));
2984 body.emit(assign(array_ref(adj, 1), neg(matrix_elt(m, 1, 0)), 1 << 0));
2985 body.emit(assign(array_ref(adj, 1), matrix_elt(m, 0, 0), 1 << 1));
2986
2987 ir_expression *det =
2988 sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 1, 1)),
2989 mul(matrix_elt(m, 1, 0), matrix_elt(m, 0, 1)));
2990
2991 body.emit(ret(div(adj, det)));
2992 return sig;
2993 }
2994
2995 ir_function_signature *
2996 builtin_builder::_inverse_mat3()
2997 {
2998 ir_variable *m = in_var(glsl_type::mat3_type, "m");
2999 MAKE_SIG(glsl_type::mat3_type, v120, 1, m);
3000
3001 ir_variable *f11_22_21_12 = body.make_temp(glsl_type::float_type, "f11_22_21_12");
3002 ir_variable *f10_22_20_12 = body.make_temp(glsl_type::float_type, "f10_22_20_12");
3003 ir_variable *f10_21_20_11 = body.make_temp(glsl_type::float_type, "f10_21_20_11");
3004
3005 body.emit(assign(f11_22_21_12,
3006 sub(mul(matrix_elt(m, 1, 1), matrix_elt(m, 2, 2)),
3007 mul(matrix_elt(m, 2, 1), matrix_elt(m, 1, 2)))));
3008 body.emit(assign(f10_22_20_12,
3009 sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 2)),
3010 mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 2)))));
3011 body.emit(assign(f10_21_20_11,
3012 sub(mul(matrix_elt(m, 1, 0), matrix_elt(m, 2, 1)),
3013 mul(matrix_elt(m, 2, 0), matrix_elt(m, 1, 1)))));
3014
3015 ir_variable *adj = body.make_temp(glsl_type::mat3_type, "adj");
3016 body.emit(assign(array_ref(adj, 0), f11_22_21_12, WRITEMASK_X));
3017 body.emit(assign(array_ref(adj, 1), neg(f10_22_20_12), WRITEMASK_X));
3018 body.emit(assign(array_ref(adj, 2), f10_21_20_11, WRITEMASK_X));
3019
3020 body.emit(assign(array_ref(adj, 0), neg(
3021 sub(mul(matrix_elt(m, 0, 1), matrix_elt(m, 2, 2)),
3022 mul(matrix_elt(m, 2, 1), matrix_elt(m, 0, 2)))),
3023 WRITEMASK_Y));
3024 body.emit(assign(array_ref(adj, 1),
3025 sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 2, 2)),
3026 mul(matrix_elt(m, 2, 0), matrix_elt(m, 0, 2))),
3027 WRITEMASK_Y));
3028 body.emit(assign(array_ref(adj, 2), neg(
3029 sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 2, 1)),
3030 mul(matrix_elt(m, 2, 0), matrix_elt(m, 0, 1)))),
3031 WRITEMASK_Y));
3032
3033 body.emit(assign(array_ref(adj, 0),
3034 sub(mul(matrix_elt(m, 0, 1), matrix_elt(m, 1, 2)),
3035 mul(matrix_elt(m, 1, 1), matrix_elt(m, 0, 2))),
3036 WRITEMASK_Z));
3037 body.emit(assign(array_ref(adj, 1), neg(
3038 sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 1, 2)),
3039 mul(matrix_elt(m, 1, 0), matrix_elt(m, 0, 2)))),
3040 WRITEMASK_Z));
3041 body.emit(assign(array_ref(adj, 2),
3042 sub(mul(matrix_elt(m, 0, 0), matrix_elt(m, 1, 1)),
3043 mul(matrix_elt(m, 1, 0), matrix_elt(m, 0, 1))),
3044 WRITEMASK_Z));
3045
3046 ir_expression *det =
3047 add(sub(mul(matrix_elt(m, 0, 0), f11_22_21_12),
3048 mul(matrix_elt(m, 0, 1), f10_22_20_12)),
3049 mul(matrix_elt(m, 0, 2), f10_21_20_11));
3050
3051 body.emit(ret(div(adj, det)));
3052
3053 return sig;
3054 }
3055
3056 ir_function_signature *
3057 builtin_builder::_inverse_mat4()
3058 {
3059 ir_variable *m = in_var(glsl_type::mat4_type, "m");
3060 MAKE_SIG(glsl_type::mat4_type, v120, 1, m);
3061
3062 ir_variable *SubFactor00 = body.make_temp(glsl_type::float_type, "SubFactor00");
3063 ir_variable *SubFactor01 = body.make_temp(glsl_type::float_type, "SubFactor01");
3064 ir_variable *SubFactor02 = body.make_temp(glsl_type::float_type, "SubFactor02");
3065 ir_variable *SubFactor03 = body.make_temp(glsl_type::float_type, "SubFactor03");
3066 ir_variable *SubFactor04 = body.make_temp(glsl_type::float_type, "SubFactor04");
3067 ir_variable *SubFactor05 = body.make_temp(glsl_type::float_type, "SubFactor05");
3068 ir_variable *SubFactor06 = body.make_temp(glsl_type::float_type, "SubFactor06");
3069 ir_variable *SubFactor07 = body.make_temp(glsl_type::float_type, "SubFactor07");
3070 ir_variable *SubFactor08 = body.make_temp(glsl_type::float_type, "SubFactor08");
3071 ir_variable *SubFactor09 = body.make_temp(glsl_type::float_type, "SubFactor09");
3072 ir_variable *SubFactor10 = body.make_temp(glsl_type::float_type, "SubFactor10");
3073 ir_variable *SubFactor11 = body.make_temp(glsl_type::float_type, "SubFactor11");
3074 ir_variable *SubFactor12 = body.make_temp(glsl_type::float_type, "SubFactor12");
3075 ir_variable *SubFactor13 = body.make_temp(glsl_type::float_type, "SubFactor13");
3076 ir_variable *SubFactor14 = body.make_temp(glsl_type::float_type, "SubFactor14");
3077 ir_variable *SubFactor15 = body.make_temp(glsl_type::float_type, "SubFactor15");
3078 ir_variable *SubFactor16 = body.make_temp(glsl_type::float_type, "SubFactor16");
3079 ir_variable *SubFactor17 = body.make_temp(glsl_type::float_type, "SubFactor17");
3080 ir_variable *SubFactor18 = body.make_temp(glsl_type::float_type, "SubFactor18");
3081
3082 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)))));
3083 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)))));
3084 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)))));
3085 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)))));
3086 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)))));
3087 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)))));
3088 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)))));
3089 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)))));
3090 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)))));
3091 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)))));
3092 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)))));
3093 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)))));
3094 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)))));
3095 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)))));
3096 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)))));
3097 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)))));
3098 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)))));
3099 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)))));
3100 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)))));
3101
3102 ir_variable *adj = body.make_temp(glsl_type::mat4_type, "adj");
3103 body.emit(assign(array_ref(adj, 0),
3104 add(sub(mul(matrix_elt(m, 1, 1), SubFactor00),
3105 mul(matrix_elt(m, 1, 2), SubFactor01)),
3106 mul(matrix_elt(m, 1, 3), SubFactor02)),
3107 WRITEMASK_X));
3108 body.emit(assign(array_ref(adj, 1), neg(
3109 add(sub(mul(matrix_elt(m, 1, 0), SubFactor00),
3110 mul(matrix_elt(m, 1, 2), SubFactor03)),
3111 mul(matrix_elt(m, 1, 3), SubFactor04))),
3112 WRITEMASK_X));
3113 body.emit(assign(array_ref(adj, 2),
3114 add(sub(mul(matrix_elt(m, 1, 0), SubFactor01),
3115 mul(matrix_elt(m, 1, 1), SubFactor03)),
3116 mul(matrix_elt(m, 1, 3), SubFactor05)),
3117 WRITEMASK_X));
3118 body.emit(assign(array_ref(adj, 3), neg(
3119 add(sub(mul(matrix_elt(m, 1, 0), SubFactor02),
3120 mul(matrix_elt(m, 1, 1), SubFactor04)),
3121 mul(matrix_elt(m, 1, 2), SubFactor05))),
3122 WRITEMASK_X));
3123
3124 body.emit(assign(array_ref(adj, 0), neg(
3125 add(sub(mul(matrix_elt(m, 0, 1), SubFactor00),
3126 mul(matrix_elt(m, 0, 2), SubFactor01)),
3127 mul(matrix_elt(m, 0, 3), SubFactor02))),
3128 WRITEMASK_Y));
3129 body.emit(assign(array_ref(adj, 1),
3130 add(sub(mul(matrix_elt(m, 0, 0), SubFactor00),
3131 mul(matrix_elt(m, 0, 2), SubFactor03)),
3132 mul(matrix_elt(m, 0, 3), SubFactor04)),
3133 WRITEMASK_Y));
3134 body.emit(assign(array_ref(adj, 2), neg(
3135 add(sub(mul(matrix_elt(m, 0, 0), SubFactor01),
3136 mul(matrix_elt(m, 0, 1), SubFactor03)),
3137 mul(matrix_elt(m, 0, 3), SubFactor05))),
3138 WRITEMASK_Y));
3139 body.emit(assign(array_ref(adj, 3),
3140 add(sub(mul(matrix_elt(m, 0, 0), SubFactor02),
3141 mul(matrix_elt(m, 0, 1), SubFactor04)),
3142 mul(matrix_elt(m, 0, 2), SubFactor05)),
3143 WRITEMASK_Y));
3144
3145 body.emit(assign(array_ref(adj, 0),
3146 add(sub(mul(matrix_elt(m, 0, 1), SubFactor06),
3147 mul(matrix_elt(m, 0, 2), SubFactor07)),
3148 mul(matrix_elt(m, 0, 3), SubFactor08)),
3149 WRITEMASK_Z));
3150 body.emit(assign(array_ref(adj, 1), neg(
3151 add(sub(mul(matrix_elt(m, 0, 0), SubFactor06),
3152 mul(matrix_elt(m, 0, 2), SubFactor09)),
3153 mul(matrix_elt(m, 0, 3), SubFactor10))),
3154 WRITEMASK_Z));
3155 body.emit(assign(array_ref(adj, 2),
3156 add(sub(mul(matrix_elt(m, 0, 0), SubFactor11),
3157 mul(matrix_elt(m, 0, 1), SubFactor09)),
3158 mul(matrix_elt(m, 0, 3), SubFactor12)),
3159 WRITEMASK_Z));
3160 body.emit(assign(array_ref(adj, 3), neg(
3161 add(sub(mul(matrix_elt(m, 0, 0), SubFactor08),
3162 mul(matrix_elt(m, 0, 1), SubFactor10)),
3163 mul(matrix_elt(m, 0, 2), SubFactor12))),
3164 WRITEMASK_Z));
3165
3166 body.emit(assign(array_ref(adj, 0), neg(
3167 add(sub(mul(matrix_elt(m, 0, 1), SubFactor13),
3168 mul(matrix_elt(m, 0, 2), SubFactor14)),
3169 mul(matrix_elt(m, 0, 3), SubFactor15))),
3170 WRITEMASK_W));
3171 body.emit(assign(array_ref(adj, 1),
3172 add(sub(mul(matrix_elt(m, 0, 0), SubFactor13),
3173 mul(matrix_elt(m, 0, 2), SubFactor16)),
3174 mul(matrix_elt(m, 0, 3), SubFactor17)),
3175 WRITEMASK_W));
3176 body.emit(assign(array_ref(adj, 2), neg(
3177 add(sub(mul(matrix_elt(m, 0, 0), SubFactor14),
3178 mul(matrix_elt(m, 0, 1), SubFactor16)),
3179 mul(matrix_elt(m, 0, 3), SubFactor18))),
3180 WRITEMASK_W));
3181 body.emit(assign(array_ref(adj, 3),
3182 add(sub(mul(matrix_elt(m, 0, 0), SubFactor15),
3183 mul(matrix_elt(m, 0, 1), SubFactor17)),
3184 mul(matrix_elt(m, 0, 2), SubFactor18)),
3185 WRITEMASK_W));
3186
3187 ir_expression *det =
3188 add(mul(matrix_elt(m, 0, 0), matrix_elt(adj, 0, 0)),
3189 add(mul(matrix_elt(m, 0, 1), matrix_elt(adj, 1, 0)),
3190 add(mul(matrix_elt(m, 0, 2), matrix_elt(adj, 2, 0)),
3191 mul(matrix_elt(m, 0, 3), matrix_elt(adj, 3, 0)))));
3192
3193 body.emit(ret(div(adj, det)));
3194
3195 return sig;
3196 }
3197
3198
3199 ir_function_signature *
3200 builtin_builder::_lessThan(builtin_available_predicate avail,
3201 const glsl_type *type)
3202 {
3203 return binop(ir_binop_less, avail,
3204 glsl_type::bvec(type->vector_elements), type, type);
3205 }
3206
3207 ir_function_signature *
3208 builtin_builder::_lessThanEqual(builtin_available_predicate avail,
3209 const glsl_type *type)
3210 {
3211 return binop(ir_binop_lequal, avail,
3212 glsl_type::bvec(type->vector_elements), type, type);
3213 }
3214
3215 ir_function_signature *
3216 builtin_builder::_greaterThan(builtin_available_predicate avail,
3217 const glsl_type *type)
3218 {
3219 return binop(ir_binop_greater, avail,
3220 glsl_type::bvec(type->vector_elements), type, type);
3221 }
3222
3223 ir_function_signature *
3224 builtin_builder::_greaterThanEqual(builtin_available_predicate avail,
3225 const glsl_type *type)
3226 {
3227 return binop(ir_binop_gequal, avail,
3228 glsl_type::bvec(type->vector_elements), type, type);
3229 }
3230
3231 ir_function_signature *
3232 builtin_builder::_equal(builtin_available_predicate avail,
3233 const glsl_type *type)
3234 {
3235 return binop(ir_binop_equal, avail,
3236 glsl_type::bvec(type->vector_elements), type, type);
3237 }
3238
3239 ir_function_signature *
3240 builtin_builder::_notEqual(builtin_available_predicate avail,
3241 const glsl_type *type)
3242 {
3243 return binop(ir_binop_nequal, avail,
3244 glsl_type::bvec(type->vector_elements), type, type);
3245 }
3246
3247 ir_function_signature *
3248 builtin_builder::_any(const glsl_type *type)
3249 {
3250 return unop(always_available, ir_unop_any, glsl_type::bool_type, type);
3251 }
3252
3253 ir_function_signature *
3254 builtin_builder::_all(const glsl_type *type)
3255 {
3256 ir_variable *v = in_var(type, "v");
3257 MAKE_SIG(glsl_type::bool_type, always_available, 1, v);
3258
3259 switch (type->vector_elements) {
3260 case 2:
3261 body.emit(ret(logic_and(swizzle_x(v), swizzle_y(v))));
3262 break;
3263 case 3:
3264 body.emit(ret(logic_and(logic_and(swizzle_x(v), swizzle_y(v)),
3265 swizzle_z(v))));
3266 break;
3267 case 4:
3268 body.emit(ret(logic_and(logic_and(logic_and(swizzle_x(v), swizzle_y(v)),
3269 swizzle_z(v)),
3270 swizzle_w(v))));
3271 break;
3272 }
3273
3274 return sig;
3275 }
3276
3277 UNOP(not, ir_unop_logic_not, always_available)
3278
3279 static bool
3280 has_lod(const glsl_type *sampler_type)
3281 {
3282 assert(sampler_type->is_sampler());
3283
3284 switch (sampler_type->sampler_dimensionality) {
3285 case GLSL_SAMPLER_DIM_RECT:
3286 case GLSL_SAMPLER_DIM_BUF:
3287 case GLSL_SAMPLER_DIM_MS:
3288 return false;
3289 default:
3290 return true;
3291 }
3292 }
3293
3294 ir_function_signature *
3295 builtin_builder::_textureSize(builtin_available_predicate avail,
3296 const glsl_type *return_type,
3297 const glsl_type *sampler_type)
3298 {
3299 ir_variable *s = in_var(sampler_type, "sampler");
3300 /* The sampler always exists; add optional lod later. */
3301 MAKE_SIG(return_type, avail, 1, s);
3302
3303 ir_texture *tex = new(mem_ctx) ir_texture(ir_txs);
3304 tex->set_sampler(new(mem_ctx) ir_dereference_variable(s), return_type);
3305
3306 if (has_lod(sampler_type)) {
3307 ir_variable *lod = in_var(glsl_type::int_type, "lod");
3308 sig->parameters.push_tail(lod);
3309 tex->lod_info.lod = var_ref(lod);
3310 } else {
3311 tex->lod_info.lod = imm(0u);
3312 }
3313
3314 body.emit(ret(tex));
3315
3316 return sig;
3317 }
3318
3319 ir_function_signature *
3320 builtin_builder::_texture(ir_texture_opcode opcode,
3321 builtin_available_predicate avail,
3322 const glsl_type *return_type,
3323 const glsl_type *sampler_type,
3324 const glsl_type *coord_type,
3325 int flags)
3326 {
3327 ir_variable *s = in_var(sampler_type, "sampler");
3328 ir_variable *P = in_var(coord_type, "P");
3329 /* The sampler and coordinate always exist; add optional parameters later. */
3330 MAKE_SIG(return_type, avail, 2, s, P);
3331
3332 ir_texture *tex = new(mem_ctx) ir_texture(opcode);
3333 tex->set_sampler(var_ref(s), return_type);
3334
3335 const int coord_size = sampler_type->sampler_coordinate_components();
3336
3337 if (coord_size == coord_type->vector_elements) {
3338 tex->coordinate = var_ref(P);
3339 } else {
3340 /* The incoming coordinate also has the projector or shadow comparitor,
3341 * so we need to swizzle those away.
3342 */
3343 tex->coordinate = swizzle_for_size(P, coord_size);
3344 }
3345
3346 /* The projector is always in the last component. */
3347 if (flags & TEX_PROJECT)
3348 tex->projector = swizzle(P, coord_type->vector_elements - 1, 1);
3349
3350 /* The shadow comparitor is normally in the Z component, but a few types
3351 * have sufficiently large coordinates that it's in W.
3352 */
3353 if (sampler_type->sampler_shadow)
3354 tex->shadow_comparitor = swizzle(P, MAX2(coord_size, SWIZZLE_Z), 1);
3355
3356 if (opcode == ir_txl) {
3357 ir_variable *lod = in_var(glsl_type::float_type, "lod");
3358 sig->parameters.push_tail(lod);
3359 tex->lod_info.lod = var_ref(lod);
3360 } else if (opcode == ir_txd) {
3361 int grad_size = coord_size - (sampler_type->sampler_array ? 1 : 0);
3362 ir_variable *dPdx = in_var(glsl_type::vec(grad_size), "dPdx");
3363 ir_variable *dPdy = in_var(glsl_type::vec(grad_size), "dPdy");
3364 sig->parameters.push_tail(dPdx);
3365 sig->parameters.push_tail(dPdy);
3366 tex->lod_info.grad.dPdx = var_ref(dPdx);
3367 tex->lod_info.grad.dPdy = var_ref(dPdy);
3368 }
3369
3370 if (flags & TEX_OFFSET) {
3371 int offset_size = coord_size - (sampler_type->sampler_array ? 1 : 0);
3372 ir_variable *offset =
3373 new(mem_ctx) ir_variable(glsl_type::ivec(offset_size), "offset", ir_var_const_in);
3374 sig->parameters.push_tail(offset);
3375 tex->offset = var_ref(offset);
3376 }
3377
3378 if (opcode == ir_tg4) {
3379 if (flags & TEX_COMPONENT) {
3380 ir_variable *component =
3381 new(mem_ctx) ir_variable(glsl_type::int_type, "comp", ir_var_const_in);
3382 sig->parameters.push_tail(component);
3383 tex->lod_info.component = var_ref(component);
3384 }
3385 else {
3386 tex->lod_info.component = imm(0);
3387 }
3388 }
3389
3390 /* The "bias" parameter comes /after/ the "offset" parameter, which is
3391 * inconsistent with both textureLodOffset and textureGradOffset.
3392 */
3393 if (opcode == ir_txb) {
3394 ir_variable *bias = in_var(glsl_type::float_type, "bias");
3395 sig->parameters.push_tail(bias);
3396 tex->lod_info.bias = var_ref(bias);
3397 }
3398
3399 body.emit(ret(tex));
3400
3401 return sig;
3402 }
3403
3404 ir_function_signature *
3405 builtin_builder::_textureCubeArrayShadow()
3406 {
3407 ir_variable *s = in_var(glsl_type::samplerCubeArrayShadow_type, "sampler");
3408 ir_variable *P = in_var(glsl_type::vec4_type, "P");
3409 ir_variable *compare = in_var(glsl_type::float_type, "compare");
3410 MAKE_SIG(glsl_type::float_type, texture_cube_map_array, 3, s, P, compare);
3411
3412 ir_texture *tex = new(mem_ctx) ir_texture(ir_tex);
3413 tex->set_sampler(var_ref(s), glsl_type::float_type);
3414
3415 tex->coordinate = var_ref(P);
3416 tex->shadow_comparitor = var_ref(compare);
3417
3418 body.emit(ret(tex));
3419
3420 return sig;
3421 }
3422
3423 ir_function_signature *
3424 builtin_builder::_texelFetch(builtin_available_predicate avail,
3425 const glsl_type *return_type,
3426 const glsl_type *sampler_type,
3427 const glsl_type *coord_type,
3428 const glsl_type *offset_type)
3429 {
3430 ir_variable *s = in_var(sampler_type, "sampler");
3431 ir_variable *P = in_var(coord_type, "P");
3432 /* The sampler and coordinate always exist; add optional parameters later. */
3433 MAKE_SIG(return_type, avail, 2, s, P);
3434
3435 ir_texture *tex = new(mem_ctx) ir_texture(ir_txf);
3436 tex->coordinate = var_ref(P);
3437 tex->set_sampler(var_ref(s), return_type);
3438
3439 if (sampler_type->sampler_dimensionality == GLSL_SAMPLER_DIM_MS) {
3440 ir_variable *sample = in_var(glsl_type::int_type, "sample");
3441 sig->parameters.push_tail(sample);
3442 tex->lod_info.sample_index = var_ref(sample);
3443 tex->op = ir_txf_ms;
3444 } else if (has_lod(sampler_type)) {
3445 ir_variable *lod = in_var(glsl_type::int_type, "lod");
3446 sig->parameters.push_tail(lod);
3447 tex->lod_info.lod = var_ref(lod);
3448 } else {
3449 tex->lod_info.lod = imm(0u);
3450 }
3451
3452 if (offset_type != NULL) {
3453 ir_variable *offset =
3454 new(mem_ctx) ir_variable(offset_type, "offset", ir_var_const_in);
3455 sig->parameters.push_tail(offset);
3456 tex->offset = var_ref(offset);
3457 }
3458
3459 body.emit(ret(tex));
3460
3461 return sig;
3462 }
3463
3464 ir_function_signature *
3465 builtin_builder::_EmitVertex()
3466 {
3467 MAKE_SIG(glsl_type::void_type, gs_only, 0);
3468
3469 body.emit(new(mem_ctx) ir_emit_vertex());
3470
3471 return sig;
3472 }
3473
3474 ir_function_signature *
3475 builtin_builder::_EndPrimitive()
3476 {
3477 MAKE_SIG(glsl_type::void_type, gs_only, 0);
3478
3479 body.emit(new(mem_ctx) ir_end_primitive());
3480
3481 return sig;
3482 }
3483
3484 ir_function_signature *
3485 builtin_builder::_textureQueryLod(const glsl_type *sampler_type,
3486 const glsl_type *coord_type)
3487 {
3488 ir_variable *s = in_var(sampler_type, "sampler");
3489 ir_variable *coord = in_var(coord_type, "coord");
3490 /* The sampler and coordinate always exist; add optional parameters later. */
3491 MAKE_SIG(glsl_type::vec2_type, texture_query_lod, 2, s, coord);
3492
3493 ir_texture *tex = new(mem_ctx) ir_texture(ir_lod);
3494 tex->coordinate = var_ref(coord);
3495 tex->set_sampler(var_ref(s), glsl_type::vec2_type);
3496
3497 body.emit(ret(tex));
3498
3499 return sig;
3500 }
3501
3502 ir_function_signature *
3503 builtin_builder::_textureQueryLevels(const glsl_type *sampler_type)
3504 {
3505 ir_variable *s = in_var(sampler_type, "sampler");
3506 const glsl_type *return_type = glsl_type::int_type;
3507 MAKE_SIG(return_type, texture_query_levels, 1, s);
3508
3509 ir_texture *tex = new(mem_ctx) ir_texture(ir_query_levels);
3510 tex->set_sampler(var_ref(s), return_type);
3511
3512 body.emit(ret(tex));
3513
3514 return sig;
3515 }
3516
3517 UNOP(dFdx, ir_unop_dFdx, fs_oes_derivatives)
3518 UNOP(dFdy, ir_unop_dFdy, fs_oes_derivatives)
3519
3520 ir_function_signature *
3521 builtin_builder::_fwidth(const glsl_type *type)
3522 {
3523 ir_variable *p = in_var(type, "p");
3524 MAKE_SIG(type, fs_oes_derivatives, 1, p);
3525
3526 body.emit(ret(add(abs(expr(ir_unop_dFdx, p)), abs(expr(ir_unop_dFdy, p)))));
3527
3528 return sig;
3529 }
3530
3531 ir_function_signature *
3532 builtin_builder::_noise1(const glsl_type *type)
3533 {
3534 return unop(v110, ir_unop_noise, glsl_type::float_type, type);
3535 }
3536
3537 ir_function_signature *
3538 builtin_builder::_noise2(const glsl_type *type)
3539 {
3540 ir_variable *p = in_var(type, "p");
3541 MAKE_SIG(glsl_type::vec2_type, v110, 1, p);
3542
3543 ir_constant_data b_offset;
3544 b_offset.f[0] = 601.0f;
3545 b_offset.f[1] = 313.0f;
3546 b_offset.f[2] = 29.0f;
3547 b_offset.f[3] = 277.0f;
3548
3549 ir_variable *a = body.make_temp(glsl_type::float_type, "a");
3550 ir_variable *b = body.make_temp(glsl_type::float_type, "b");
3551 ir_variable *t = body.make_temp(glsl_type::vec2_type, "t");
3552 body.emit(assign(a, expr(ir_unop_noise, p)));
3553 body.emit(assign(b, expr(ir_unop_noise, add(p, imm(type, b_offset)))));
3554 body.emit(assign(t, a, WRITEMASK_X));
3555 body.emit(assign(t, b, WRITEMASK_Y));
3556 body.emit(ret(t));
3557
3558 return sig;
3559 }
3560
3561 ir_function_signature *
3562 builtin_builder::_noise3(const glsl_type *type)
3563 {
3564 ir_variable *p = in_var(type, "p");
3565 MAKE_SIG(glsl_type::vec3_type, v110, 1, p);
3566
3567 ir_constant_data b_offset;
3568 b_offset.f[0] = 601.0f;
3569 b_offset.f[1] = 313.0f;
3570 b_offset.f[2] = 29.0f;
3571 b_offset.f[3] = 277.0f;
3572
3573 ir_constant_data c_offset;
3574 c_offset.f[0] = 1559.0f;
3575 c_offset.f[1] = 113.0f;
3576 c_offset.f[2] = 1861.0f;
3577 c_offset.f[3] = 797.0f;
3578
3579 ir_variable *a = body.make_temp(glsl_type::float_type, "a");
3580 ir_variable *b = body.make_temp(glsl_type::float_type, "b");
3581 ir_variable *c = body.make_temp(glsl_type::float_type, "c");
3582 ir_variable *t = body.make_temp(glsl_type::vec3_type, "t");
3583 body.emit(assign(a, expr(ir_unop_noise, p)));
3584 body.emit(assign(b, expr(ir_unop_noise, add(p, imm(type, b_offset)))));
3585 body.emit(assign(c, expr(ir_unop_noise, add(p, imm(type, c_offset)))));
3586 body.emit(assign(t, a, WRITEMASK_X));
3587 body.emit(assign(t, b, WRITEMASK_Y));
3588 body.emit(assign(t, c, WRITEMASK_Z));
3589 body.emit(ret(t));
3590
3591 return sig;
3592 }
3593
3594 ir_function_signature *
3595 builtin_builder::_noise4(const glsl_type *type)
3596 {
3597 ir_variable *p = in_var(type, "p");
3598 MAKE_SIG(glsl_type::vec4_type, v110, 1, p);
3599
3600 ir_variable *_p = body.make_temp(type, "_p");
3601
3602 ir_constant_data p_offset;
3603 p_offset.f[0] = 1559.0f;
3604 p_offset.f[1] = 113.0f;
3605 p_offset.f[2] = 1861.0f;
3606 p_offset.f[3] = 797.0f;
3607
3608 body.emit(assign(_p, add(p, imm(type, p_offset))));
3609
3610 ir_constant_data offset;
3611 offset.f[0] = 601.0f;
3612 offset.f[1] = 313.0f;
3613 offset.f[2] = 29.0f;
3614 offset.f[3] = 277.0f;
3615
3616 ir_variable *a = body.make_temp(glsl_type::float_type, "a");
3617 ir_variable *b = body.make_temp(glsl_type::float_type, "b");
3618 ir_variable *c = body.make_temp(glsl_type::float_type, "c");
3619 ir_variable *d = body.make_temp(glsl_type::float_type, "d");
3620 ir_variable *t = body.make_temp(glsl_type::vec4_type, "t");
3621 body.emit(assign(a, expr(ir_unop_noise, p)));
3622 body.emit(assign(b, expr(ir_unop_noise, add(p, imm(type, offset)))));
3623 body.emit(assign(c, expr(ir_unop_noise, _p)));
3624 body.emit(assign(d, expr(ir_unop_noise, add(_p, imm(type, offset)))));
3625 body.emit(assign(t, a, WRITEMASK_X));
3626 body.emit(assign(t, b, WRITEMASK_Y));
3627 body.emit(assign(t, c, WRITEMASK_Z));
3628 body.emit(assign(t, d, WRITEMASK_W));
3629 body.emit(ret(t));
3630
3631 return sig;
3632 }
3633
3634 ir_function_signature *
3635 builtin_builder::_bitfieldExtract(const glsl_type *type)
3636 {
3637 ir_variable *value = in_var(type, "value");
3638 ir_variable *offset = in_var(glsl_type::int_type, "offset");
3639 ir_variable *bits = in_var(glsl_type::int_type, "bits");
3640 MAKE_SIG(type, gpu_shader5, 3, value, offset, bits);
3641
3642 body.emit(ret(expr(ir_triop_bitfield_extract, value, offset, bits)));
3643
3644 return sig;
3645 }
3646
3647 ir_function_signature *
3648 builtin_builder::_bitfieldInsert(const glsl_type *type)
3649 {
3650 ir_variable *base = in_var(type, "base");
3651 ir_variable *insert = in_var(type, "insert");
3652 ir_variable *offset = in_var(glsl_type::int_type, "offset");
3653 ir_variable *bits = in_var(glsl_type::int_type, "bits");
3654 MAKE_SIG(type, gpu_shader5, 4, base, insert, offset, bits);
3655
3656 body.emit(ret(bitfield_insert(base, insert, offset, bits)));
3657
3658 return sig;
3659 }
3660
3661 UNOP(bitfieldReverse, ir_unop_bitfield_reverse, gpu_shader5)
3662
3663 ir_function_signature *
3664 builtin_builder::_bitCount(const glsl_type *type)
3665 {
3666 return unop(gpu_shader5, ir_unop_bit_count,
3667 glsl_type::ivec(type->vector_elements), type);
3668 }
3669
3670 ir_function_signature *
3671 builtin_builder::_findLSB(const glsl_type *type)
3672 {
3673 return unop(gpu_shader5, ir_unop_find_lsb,
3674 glsl_type::ivec(type->vector_elements), type);
3675 }
3676
3677 ir_function_signature *
3678 builtin_builder::_findMSB(const glsl_type *type)
3679 {
3680 return unop(gpu_shader5, ir_unop_find_msb,
3681 glsl_type::ivec(type->vector_elements), type);
3682 }
3683
3684 ir_function_signature *
3685 builtin_builder::_fma(const glsl_type *type)
3686 {
3687 ir_variable *a = in_var(type, "a");
3688 ir_variable *b = in_var(type, "b");
3689 ir_variable *c = in_var(type, "c");
3690 MAKE_SIG(type, gpu_shader5, 3, a, b, c);
3691
3692 body.emit(ret(fma(a, b, c)));
3693
3694 return sig;
3695 }
3696
3697 ir_function_signature *
3698 builtin_builder::_ldexp(const glsl_type *x_type, const glsl_type *exp_type)
3699 {
3700 return binop(ir_binop_ldexp, gpu_shader5, x_type, x_type, exp_type);
3701 }
3702
3703 ir_function_signature *
3704 builtin_builder::_frexp(const glsl_type *x_type, const glsl_type *exp_type)
3705 {
3706 ir_variable *x = in_var(x_type, "x");
3707 ir_variable *exponent = out_var(exp_type, "exp");
3708 MAKE_SIG(x_type, gpu_shader5, 2, x, exponent);
3709
3710 const unsigned vec_elem = x_type->vector_elements;
3711 const glsl_type *bvec = glsl_type::get_instance(GLSL_TYPE_BOOL, vec_elem, 1);
3712 const glsl_type *uvec = glsl_type::get_instance(GLSL_TYPE_UINT, vec_elem, 1);
3713
3714 /* Single-precision floating-point values are stored as
3715 * 1 sign bit;
3716 * 8 exponent bits;
3717 * 23 mantissa bits.
3718 *
3719 * An exponent shift of 23 will shift the mantissa out, leaving only the
3720 * exponent and sign bit (which itself may be zero, if the absolute value
3721 * was taken before the bitcast and shift.
3722 */
3723 ir_constant *exponent_shift = imm(23);
3724 ir_constant *exponent_bias = imm(-126, vec_elem);
3725
3726 ir_constant *sign_mantissa_mask = imm(0x807fffffu, vec_elem);
3727
3728 /* Exponent of floating-point values in the range [0.5, 1.0). */
3729 ir_constant *exponent_value = imm(0x3f000000u, vec_elem);
3730
3731 ir_variable *is_not_zero = body.make_temp(bvec, "is_not_zero");
3732 body.emit(assign(is_not_zero, nequal(abs(x), imm(0.0f, vec_elem))));
3733
3734 /* Since abs(x) ensures that the sign bit is zero, we don't need to bitcast
3735 * to unsigned integers to ensure that 1 bits aren't shifted in.
3736 */
3737 body.emit(assign(exponent, rshift(bitcast_f2i(abs(x)), exponent_shift)));
3738 body.emit(assign(exponent, add(exponent, csel(is_not_zero, exponent_bias,
3739 imm(0, vec_elem)))));
3740
3741 ir_variable *bits = body.make_temp(uvec, "bits");
3742 body.emit(assign(bits, bitcast_f2u(x)));
3743 body.emit(assign(bits, bit_and(bits, sign_mantissa_mask)));
3744 body.emit(assign(bits, bit_or(bits, csel(is_not_zero, exponent_value,
3745 imm(0u, vec_elem)))));
3746 body.emit(ret(bitcast_u2f(bits)));
3747
3748 return sig;
3749 }
3750
3751 ir_function_signature *
3752 builtin_builder::_uaddCarry(const glsl_type *type)
3753 {
3754 ir_variable *x = in_var(type, "x");
3755 ir_variable *y = in_var(type, "y");
3756 ir_variable *carry = out_var(type, "carry");
3757 MAKE_SIG(type, gpu_shader5, 3, x, y, carry);
3758
3759 body.emit(assign(carry, ir_builder::carry(x, y)));
3760 body.emit(ret(add(x, y)));
3761
3762 return sig;
3763 }
3764
3765 ir_function_signature *
3766 builtin_builder::_usubBorrow(const glsl_type *type)
3767 {
3768 ir_variable *x = in_var(type, "x");
3769 ir_variable *y = in_var(type, "y");
3770 ir_variable *borrow = out_var(type, "borrow");
3771 MAKE_SIG(type, gpu_shader5, 3, x, y, borrow);
3772
3773 body.emit(assign(borrow, ir_builder::borrow(x, y)));
3774 body.emit(ret(sub(x, y)));
3775
3776 return sig;
3777 }
3778
3779 /**
3780 * For both imulExtended() and umulExtended() built-ins.
3781 */
3782 ir_function_signature *
3783 builtin_builder::_mulExtended(const glsl_type *type)
3784 {
3785 ir_variable *x = in_var(type, "x");
3786 ir_variable *y = in_var(type, "y");
3787 ir_variable *msb = out_var(type, "msb");
3788 ir_variable *lsb = out_var(type, "lsb");
3789 MAKE_SIG(glsl_type::void_type, gpu_shader5, 4, x, y, msb, lsb);
3790
3791 body.emit(assign(msb, imul_high(x, y)));
3792 body.emit(assign(lsb, mul(x, y)));
3793
3794 return sig;
3795 }
3796 /** @} */
3797
3798 /******************************************************************************/
3799
3800 /* The singleton instance of builtin_builder. */
3801 static builtin_builder builtins;
3802
3803 /**
3804 * External API (exposing the built-in module to the rest of the compiler):
3805 * @{
3806 */
3807 void
3808 _mesa_glsl_initialize_builtin_functions()
3809 {
3810 builtins.initialize();
3811 }
3812
3813 void
3814 _mesa_glsl_release_builtin_functions()
3815 {
3816 builtins.release();
3817 }
3818
3819 ir_function_signature *
3820 _mesa_glsl_find_builtin_function(_mesa_glsl_parse_state *state,
3821 const char *name, exec_list *actual_parameters)
3822 {
3823 return builtins.find(state, name, actual_parameters);
3824 }
3825 /** @} */