3441907b6c182e3d95dc40b38a9eec9b52f42417
[mesa.git] / src / gallium / docs / source / tgsi.rst
1 TGSI
2 ====
3
4 TGSI, Tungsten Graphics Shader Infrastructure, is an intermediate language
5 for describing shaders. Since Gallium is inherently shaderful, shaders are
6 an important part of the API. TGSI is the only intermediate representation
7 used by all drivers.
8
9 Basics
10 ------
11
12 All TGSI instructions, known as *opcodes*, operate on arbitrary-precision
13 floating-point four-component vectors. An opcode may have up to one
14 destination register, known as *dst*, and between zero and three source
15 registers, called *src0* through *src2*, or simply *src* if there is only
16 one.
17
18 Some instructions, like :opcode:`I2F`, permit re-interpretation of vector
19 components as integers. Other instructions permit using registers as
20 two-component vectors with double precision; see :ref:`doubleopcodes`.
21
22 When an instruction has a scalar result, the result is usually copied into
23 each of the components of *dst*. When this happens, the result is said to be
24 *replicated* to *dst*. :opcode:`RCP` is one such instruction.
25
26 Modifiers
27 ^^^^^^^^^^^^^^^
28
29 TGSI supports modifiers on inputs (as well as saturate and precise modifier
30 on instructions).
31
32 For arithmetic instruction having a precise modifier certain optimizations
33 which may alter the result are disallowed. Example: *add(mul(a,b),c)* can't be
34 optimized to TGSI_OPCODE_MAD, because some hardware only supports the fused
35 MAD instruction.
36
37 For inputs which have a floating point type, both absolute value and
38 negation modifiers are supported (with absolute value being applied
39 first). The only source of TGSI_OPCODE_MOV and the second and third
40 sources of TGSI_OPCODE_UCMP are considered to have float type for
41 applying modifiers.
42
43 For inputs which have signed or unsigned type only the negate modifier is
44 supported.
45
46 Instruction Set
47 ---------------
48
49 Core ISA
50 ^^^^^^^^^^^^^^^^^^^^^^^^^
51
52 These opcodes are guaranteed to be available regardless of the driver being
53 used.
54
55 .. opcode:: ARL - Address Register Load
56
57 .. math::
58
59 dst.x = (int) \lfloor src.x\rfloor
60
61 dst.y = (int) \lfloor src.y\rfloor
62
63 dst.z = (int) \lfloor src.z\rfloor
64
65 dst.w = (int) \lfloor src.w\rfloor
66
67
68 .. opcode:: MOV - Move
69
70 .. math::
71
72 dst.x = src.x
73
74 dst.y = src.y
75
76 dst.z = src.z
77
78 dst.w = src.w
79
80
81 .. opcode:: LIT - Light Coefficients
82
83 .. math::
84
85 dst.x &= 1 \\
86 dst.y &= max(src.x, 0) \\
87 dst.z &= (src.x > 0) ? max(src.y, 0)^{clamp(src.w, -128, 128))} : 0 \\
88 dst.w &= 1
89
90
91 .. opcode:: RCP - Reciprocal
92
93 This instruction replicates its result.
94
95 .. math::
96
97 dst = \frac{1}{src.x}
98
99
100 .. opcode:: RSQ - Reciprocal Square Root
101
102 This instruction replicates its result. The results are undefined for src <= 0.
103
104 .. math::
105
106 dst = \frac{1}{\sqrt{src.x}}
107
108
109 .. opcode:: SQRT - Square Root
110
111 This instruction replicates its result. The results are undefined for src < 0.
112
113 .. math::
114
115 dst = {\sqrt{src.x}}
116
117
118 .. opcode:: EXP - Approximate Exponential Base 2
119
120 .. math::
121
122 dst.x &= 2^{\lfloor src.x\rfloor} \\
123 dst.y &= src.x - \lfloor src.x\rfloor \\
124 dst.z &= 2^{src.x} \\
125 dst.w &= 1
126
127
128 .. opcode:: LOG - Approximate Logarithm Base 2
129
130 .. math::
131
132 dst.x &= \lfloor\log_2{|src.x|}\rfloor \\
133 dst.y &= \frac{|src.x|}{2^{\lfloor\log_2{|src.x|}\rfloor}} \\
134 dst.z &= \log_2{|src.x|} \\
135 dst.w &= 1
136
137
138 .. opcode:: MUL - Multiply
139
140 .. math::
141
142 dst.x = src0.x \times src1.x
143
144 dst.y = src0.y \times src1.y
145
146 dst.z = src0.z \times src1.z
147
148 dst.w = src0.w \times src1.w
149
150
151 .. opcode:: ADD - Add
152
153 .. math::
154
155 dst.x = src0.x + src1.x
156
157 dst.y = src0.y + src1.y
158
159 dst.z = src0.z + src1.z
160
161 dst.w = src0.w + src1.w
162
163
164 .. opcode:: DP3 - 3-component Dot Product
165
166 This instruction replicates its result.
167
168 .. math::
169
170 dst = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z
171
172
173 .. opcode:: DP4 - 4-component Dot Product
174
175 This instruction replicates its result.
176
177 .. math::
178
179 dst = src0.x \times src1.x + src0.y \times src1.y + src0.z \times src1.z + src0.w \times src1.w
180
181
182 .. opcode:: DST - Distance Vector
183
184 .. math::
185
186 dst.x &= 1\\
187 dst.y &= src0.y \times src1.y\\
188 dst.z &= src0.z\\
189 dst.w &= src1.w
190
191
192 .. opcode:: MIN - Minimum
193
194 .. math::
195
196 dst.x = min(src0.x, src1.x)
197
198 dst.y = min(src0.y, src1.y)
199
200 dst.z = min(src0.z, src1.z)
201
202 dst.w = min(src0.w, src1.w)
203
204
205 .. opcode:: MAX - Maximum
206
207 .. math::
208
209 dst.x = max(src0.x, src1.x)
210
211 dst.y = max(src0.y, src1.y)
212
213 dst.z = max(src0.z, src1.z)
214
215 dst.w = max(src0.w, src1.w)
216
217
218 .. opcode:: SLT - Set On Less Than
219
220 .. math::
221
222 dst.x = (src0.x < src1.x) ? 1.0F : 0.0F
223
224 dst.y = (src0.y < src1.y) ? 1.0F : 0.0F
225
226 dst.z = (src0.z < src1.z) ? 1.0F : 0.0F
227
228 dst.w = (src0.w < src1.w) ? 1.0F : 0.0F
229
230
231 .. opcode:: SGE - Set On Greater Equal Than
232
233 .. math::
234
235 dst.x = (src0.x >= src1.x) ? 1.0F : 0.0F
236
237 dst.y = (src0.y >= src1.y) ? 1.0F : 0.0F
238
239 dst.z = (src0.z >= src1.z) ? 1.0F : 0.0F
240
241 dst.w = (src0.w >= src1.w) ? 1.0F : 0.0F
242
243
244 .. opcode:: MAD - Multiply And Add
245
246 Perform a * b + c. The implementation is free to decide whether there is an
247 intermediate rounding step or not.
248
249 .. math::
250
251 dst.x = src0.x \times src1.x + src2.x
252
253 dst.y = src0.y \times src1.y + src2.y
254
255 dst.z = src0.z \times src1.z + src2.z
256
257 dst.w = src0.w \times src1.w + src2.w
258
259
260 .. opcode:: LRP - Linear Interpolate
261
262 .. math::
263
264 dst.x = src0.x \times src1.x + (1 - src0.x) \times src2.x
265
266 dst.y = src0.y \times src1.y + (1 - src0.y) \times src2.y
267
268 dst.z = src0.z \times src1.z + (1 - src0.z) \times src2.z
269
270 dst.w = src0.w \times src1.w + (1 - src0.w) \times src2.w
271
272
273 .. opcode:: FMA - Fused Multiply-Add
274
275 Perform a * b + c with no intermediate rounding step.
276
277 .. math::
278
279 dst.x = src0.x \times src1.x + src2.x
280
281 dst.y = src0.y \times src1.y + src2.y
282
283 dst.z = src0.z \times src1.z + src2.z
284
285 dst.w = src0.w \times src1.w + src2.w
286
287
288 .. opcode:: FRC - Fraction
289
290 .. math::
291
292 dst.x = src.x - \lfloor src.x\rfloor
293
294 dst.y = src.y - \lfloor src.y\rfloor
295
296 dst.z = src.z - \lfloor src.z\rfloor
297
298 dst.w = src.w - \lfloor src.w\rfloor
299
300
301 .. opcode:: FLR - Floor
302
303 .. math::
304
305 dst.x = \lfloor src.x\rfloor
306
307 dst.y = \lfloor src.y\rfloor
308
309 dst.z = \lfloor src.z\rfloor
310
311 dst.w = \lfloor src.w\rfloor
312
313
314 .. opcode:: ROUND - Round
315
316 .. math::
317
318 dst.x = round(src.x)
319
320 dst.y = round(src.y)
321
322 dst.z = round(src.z)
323
324 dst.w = round(src.w)
325
326
327 .. opcode:: EX2 - Exponential Base 2
328
329 This instruction replicates its result.
330
331 .. math::
332
333 dst = 2^{src.x}
334
335
336 .. opcode:: LG2 - Logarithm Base 2
337
338 This instruction replicates its result.
339
340 .. math::
341
342 dst = \log_2{src.x}
343
344
345 .. opcode:: POW - Power
346
347 This instruction replicates its result.
348
349 .. math::
350
351 dst = src0.x^{src1.x}
352
353
354 .. opcode:: COS - Cosine
355
356 This instruction replicates its result.
357
358 .. math::
359
360 dst = \cos{src.x}
361
362
363 .. opcode:: DDX, DDX_FINE - Derivative Relative To X
364
365 The fine variant is only used when ``PIPE_CAP_TGSI_FS_FINE_DERIVATIVE`` is
366 advertised. When it is, the fine version guarantees one derivative per row
367 while DDX is allowed to be the same for the entire 2x2 quad.
368
369 .. math::
370
371 dst.x = partialx(src.x)
372
373 dst.y = partialx(src.y)
374
375 dst.z = partialx(src.z)
376
377 dst.w = partialx(src.w)
378
379
380 .. opcode:: DDY, DDY_FINE - Derivative Relative To Y
381
382 The fine variant is only used when ``PIPE_CAP_TGSI_FS_FINE_DERIVATIVE`` is
383 advertised. When it is, the fine version guarantees one derivative per column
384 while DDY is allowed to be the same for the entire 2x2 quad.
385
386 .. math::
387
388 dst.x = partialy(src.x)
389
390 dst.y = partialy(src.y)
391
392 dst.z = partialy(src.z)
393
394 dst.w = partialy(src.w)
395
396
397 .. opcode:: PK2H - Pack Two 16-bit Floats
398
399 This instruction replicates its result.
400
401 .. math::
402
403 dst = f32\_to\_f16(src.x) | f32\_to\_f16(src.y) << 16
404
405
406 .. opcode:: PK2US - Pack Two Unsigned 16-bit Scalars
407
408 TBD
409
410
411 .. opcode:: PK4B - Pack Four Signed 8-bit Scalars
412
413 TBD
414
415
416 .. opcode:: PK4UB - Pack Four Unsigned 8-bit Scalars
417
418 TBD
419
420
421 .. opcode:: SEQ - Set On Equal
422
423 .. math::
424
425 dst.x = (src0.x == src1.x) ? 1.0F : 0.0F
426
427 dst.y = (src0.y == src1.y) ? 1.0F : 0.0F
428
429 dst.z = (src0.z == src1.z) ? 1.0F : 0.0F
430
431 dst.w = (src0.w == src1.w) ? 1.0F : 0.0F
432
433
434 .. opcode:: SGT - Set On Greater Than
435
436 .. math::
437
438 dst.x = (src0.x > src1.x) ? 1.0F : 0.0F
439
440 dst.y = (src0.y > src1.y) ? 1.0F : 0.0F
441
442 dst.z = (src0.z > src1.z) ? 1.0F : 0.0F
443
444 dst.w = (src0.w > src1.w) ? 1.0F : 0.0F
445
446
447 .. opcode:: SIN - Sine
448
449 This instruction replicates its result.
450
451 .. math::
452
453 dst = \sin{src.x}
454
455
456 .. opcode:: SLE - Set On Less Equal Than
457
458 .. math::
459
460 dst.x = (src0.x <= src1.x) ? 1.0F : 0.0F
461
462 dst.y = (src0.y <= src1.y) ? 1.0F : 0.0F
463
464 dst.z = (src0.z <= src1.z) ? 1.0F : 0.0F
465
466 dst.w = (src0.w <= src1.w) ? 1.0F : 0.0F
467
468
469 .. opcode:: SNE - Set On Not Equal
470
471 .. math::
472
473 dst.x = (src0.x != src1.x) ? 1.0F : 0.0F
474
475 dst.y = (src0.y != src1.y) ? 1.0F : 0.0F
476
477 dst.z = (src0.z != src1.z) ? 1.0F : 0.0F
478
479 dst.w = (src0.w != src1.w) ? 1.0F : 0.0F
480
481
482 .. opcode:: TEX - Texture Lookup
483
484 for array textures src0.y contains the slice for 1D,
485 and src0.z contain the slice for 2D.
486
487 for shadow textures with no arrays (and not cube map),
488 src0.z contains the reference value.
489
490 for shadow textures with arrays, src0.z contains
491 the reference value for 1D arrays, and src0.w contains
492 the reference value for 2D arrays and cube maps.
493
494 for cube map array shadow textures, the reference value
495 cannot be passed in src0.w, and TEX2 must be used instead.
496
497 .. math::
498
499 coord = src0
500
501 shadow_ref = src0.z or src0.w (optional)
502
503 unit = src1
504
505 dst = texture\_sample(unit, coord, shadow_ref)
506
507
508 .. opcode:: TEX2 - Texture Lookup (for shadow cube map arrays only)
509
510 this is the same as TEX, but uses another reg to encode the
511 reference value.
512
513 .. math::
514
515 coord = src0
516
517 shadow_ref = src1.x
518
519 unit = src2
520
521 dst = texture\_sample(unit, coord, shadow_ref)
522
523
524
525
526 .. opcode:: TXD - Texture Lookup with Derivatives
527
528 .. math::
529
530 coord = src0
531
532 ddx = src1
533
534 ddy = src2
535
536 unit = src3
537
538 dst = texture\_sample\_deriv(unit, coord, ddx, ddy)
539
540
541 .. opcode:: TXP - Projective Texture Lookup
542
543 .. math::
544
545 coord.x = src0.x / src0.w
546
547 coord.y = src0.y / src0.w
548
549 coord.z = src0.z / src0.w
550
551 coord.w = src0.w
552
553 unit = src1
554
555 dst = texture\_sample(unit, coord)
556
557
558 .. opcode:: UP2H - Unpack Two 16-Bit Floats
559
560 .. math::
561
562 dst.x = f16\_to\_f32(src0.x \& 0xffff)
563
564 dst.y = f16\_to\_f32(src0.x >> 16)
565
566 dst.z = f16\_to\_f32(src0.x \& 0xffff)
567
568 dst.w = f16\_to\_f32(src0.x >> 16)
569
570 .. note::
571
572 Considered for removal.
573
574 .. opcode:: UP2US - Unpack Two Unsigned 16-Bit Scalars
575
576 TBD
577
578 .. note::
579
580 Considered for removal.
581
582 .. opcode:: UP4B - Unpack Four Signed 8-Bit Values
583
584 TBD
585
586 .. note::
587
588 Considered for removal.
589
590 .. opcode:: UP4UB - Unpack Four Unsigned 8-Bit Scalars
591
592 TBD
593
594 .. note::
595
596 Considered for removal.
597
598
599 .. opcode:: ARR - Address Register Load With Round
600
601 .. math::
602
603 dst.x = (int) round(src.x)
604
605 dst.y = (int) round(src.y)
606
607 dst.z = (int) round(src.z)
608
609 dst.w = (int) round(src.w)
610
611
612 .. opcode:: SSG - Set Sign
613
614 .. math::
615
616 dst.x = (src.x > 0) ? 1 : (src.x < 0) ? -1 : 0
617
618 dst.y = (src.y > 0) ? 1 : (src.y < 0) ? -1 : 0
619
620 dst.z = (src.z > 0) ? 1 : (src.z < 0) ? -1 : 0
621
622 dst.w = (src.w > 0) ? 1 : (src.w < 0) ? -1 : 0
623
624
625 .. opcode:: CMP - Compare
626
627 .. math::
628
629 dst.x = (src0.x < 0) ? src1.x : src2.x
630
631 dst.y = (src0.y < 0) ? src1.y : src2.y
632
633 dst.z = (src0.z < 0) ? src1.z : src2.z
634
635 dst.w = (src0.w < 0) ? src1.w : src2.w
636
637
638 .. opcode:: KILL_IF - Conditional Discard
639
640 Conditional discard. Allowed in fragment shaders only.
641
642 .. math::
643
644 if (src.x < 0 || src.y < 0 || src.z < 0 || src.w < 0)
645 discard
646 endif
647
648
649 .. opcode:: KILL - Discard
650
651 Unconditional discard. Allowed in fragment shaders only.
652
653
654 .. opcode:: SCS - Sine Cosine
655
656 .. math::
657
658 dst.x = \cos{src.x}
659
660 dst.y = \sin{src.x}
661
662 dst.z = 0
663
664 dst.w = 1
665
666
667 .. opcode:: TXB - Texture Lookup With Bias
668
669 for cube map array textures and shadow cube maps, the bias value
670 cannot be passed in src0.w, and TXB2 must be used instead.
671
672 if the target is a shadow texture, the reference value is always
673 in src.z (this prevents shadow 3d and shadow 2d arrays from
674 using this instruction, but this is not needed).
675
676 .. math::
677
678 coord.x = src0.x
679
680 coord.y = src0.y
681
682 coord.z = src0.z
683
684 coord.w = none
685
686 bias = src0.w
687
688 unit = src1
689
690 dst = texture\_sample(unit, coord, bias)
691
692
693 .. opcode:: TXB2 - Texture Lookup With Bias (some cube maps only)
694
695 this is the same as TXB, but uses another reg to encode the
696 lod bias value for cube map arrays and shadow cube maps.
697 Presumably shadow 2d arrays and shadow 3d targets could use
698 this encoding too, but this is not legal.
699
700 shadow cube map arrays are neither possible nor required.
701
702 .. math::
703
704 coord = src0
705
706 bias = src1.x
707
708 unit = src2
709
710 dst = texture\_sample(unit, coord, bias)
711
712
713 .. opcode:: DIV - Divide
714
715 .. math::
716
717 dst.x = \frac{src0.x}{src1.x}
718
719 dst.y = \frac{src0.y}{src1.y}
720
721 dst.z = \frac{src0.z}{src1.z}
722
723 dst.w = \frac{src0.w}{src1.w}
724
725
726 .. opcode:: DP2 - 2-component Dot Product
727
728 This instruction replicates its result.
729
730 .. math::
731
732 dst = src0.x \times src1.x + src0.y \times src1.y
733
734
735 .. opcode:: TEX_LZ - Texture Lookup With LOD = 0
736
737 This is the same as TXL with LOD = 0. Like every texture opcode, it obeys
738 pipe_sampler_view::u.tex.first_level and pipe_sampler_state::min_lod.
739 There is no way to override those two in shaders.
740
741 .. math::
742
743 coord.x = src0.x
744
745 coord.y = src0.y
746
747 coord.z = src0.z
748
749 coord.w = none
750
751 lod = 0
752
753 unit = src1
754
755 dst = texture\_sample(unit, coord, lod)
756
757
758 .. opcode:: TXL - Texture Lookup With explicit LOD
759
760 for cube map array textures, the explicit lod value
761 cannot be passed in src0.w, and TXL2 must be used instead.
762
763 if the target is a shadow texture, the reference value is always
764 in src.z (this prevents shadow 3d / 2d array / cube targets from
765 using this instruction, but this is not needed).
766
767 .. math::
768
769 coord.x = src0.x
770
771 coord.y = src0.y
772
773 coord.z = src0.z
774
775 coord.w = none
776
777 lod = src0.w
778
779 unit = src1
780
781 dst = texture\_sample(unit, coord, lod)
782
783
784 .. opcode:: TXL2 - Texture Lookup With explicit LOD (for cube map arrays only)
785
786 this is the same as TXL, but uses another reg to encode the
787 explicit lod value.
788 Presumably shadow 3d / 2d array / cube targets could use
789 this encoding too, but this is not legal.
790
791 shadow cube map arrays are neither possible nor required.
792
793 .. math::
794
795 coord = src0
796
797 lod = src1.x
798
799 unit = src2
800
801 dst = texture\_sample(unit, coord, lod)
802
803
804 Compute ISA
805 ^^^^^^^^^^^^^^^^^^^^^^^^
806
807 These opcodes are primarily provided for special-use computational shaders.
808 Support for these opcodes indicated by a special pipe capability bit (TBD).
809
810 XXX doesn't look like most of the opcodes really belong here.
811
812 .. opcode:: CEIL - Ceiling
813
814 .. math::
815
816 dst.x = \lceil src.x\rceil
817
818 dst.y = \lceil src.y\rceil
819
820 dst.z = \lceil src.z\rceil
821
822 dst.w = \lceil src.w\rceil
823
824
825 .. opcode:: TRUNC - Truncate
826
827 .. math::
828
829 dst.x = trunc(src.x)
830
831 dst.y = trunc(src.y)
832
833 dst.z = trunc(src.z)
834
835 dst.w = trunc(src.w)
836
837
838 .. opcode:: MOD - Modulus
839
840 .. math::
841
842 dst.x = src0.x \bmod src1.x
843
844 dst.y = src0.y \bmod src1.y
845
846 dst.z = src0.z \bmod src1.z
847
848 dst.w = src0.w \bmod src1.w
849
850
851 .. opcode:: UARL - Integer Address Register Load
852
853 Moves the contents of the source register, assumed to be an integer, into the
854 destination register, which is assumed to be an address (ADDR) register.
855
856
857 .. opcode:: TXF - Texel Fetch
858
859 As per NV_gpu_shader4, extract a single texel from a specified texture
860 image or PIPE_BUFFER resource. The source sampler may not be a CUBE or
861 SHADOW. src 0 is a
862 four-component signed integer vector used to identify the single texel
863 accessed. 3 components + level. If the texture is multisampled, then
864 the fourth component indicates the sample, not the mipmap level.
865 Just like texture instructions, an optional
866 offset vector is provided, which is subject to various driver restrictions
867 (regarding range, source of offsets). This instruction ignores the sampler
868 state.
869
870 TXF(uint_vec coord, int_vec offset).
871
872
873 .. opcode:: TXQ - Texture Size Query
874
875 As per NV_gpu_program4, retrieve the dimensions of the texture depending on
876 the target. For 1D (width), 2D/RECT/CUBE (width, height), 3D (width, height,
877 depth), 1D array (width, layers), 2D array (width, height, layers).
878 Also return the number of accessible levels (last_level - first_level + 1)
879 in W.
880
881 For components which don't return a resource dimension, their value
882 is undefined.
883
884 .. math::
885
886 lod = src0.x
887
888 dst.x = texture\_width(unit, lod)
889
890 dst.y = texture\_height(unit, lod)
891
892 dst.z = texture\_depth(unit, lod)
893
894 dst.w = texture\_levels(unit)
895
896
897 .. opcode:: TXQS - Texture Samples Query
898
899 This retrieves the number of samples in the texture, and stores it
900 into the x component as an unsigned integer. The other components are
901 undefined. If the texture is not multisampled, this function returns
902 (1, undef, undef, undef).
903
904 .. math::
905
906 dst.x = texture\_samples(unit)
907
908
909 .. opcode:: TG4 - Texture Gather
910
911 As per ARB_texture_gather, gathers the four texels to be used in a bi-linear
912 filtering operation and packs them into a single register. Only works with
913 2D, 2D array, cubemaps, and cubemaps arrays. For 2D textures, only the
914 addressing modes of the sampler and the top level of any mip pyramid are
915 used. Set W to zero. It behaves like the TEX instruction, but a filtered
916 sample is not generated. The four samples that contribute to filtering are
917 placed into xyzw in clockwise order, starting with the (u,v) texture
918 coordinate delta at the following locations (-, +), (+, +), (+, -), (-, -),
919 where the magnitude of the deltas are half a texel.
920
921 PIPE_CAP_TEXTURE_SM5 enhances this instruction to support shadow per-sample
922 depth compares, single component selection, and a non-constant offset. It
923 doesn't allow support for the GL independent offset to get i0,j0. This would
924 require another CAP is hw can do it natively. For now we lower that before
925 TGSI.
926
927 .. math::
928
929 coord = src0
930
931 component = src1
932
933 dst = texture\_gather4 (unit, coord, component)
934
935 (with SM5 - cube array shadow)
936
937 .. math::
938
939 coord = src0
940
941 compare = src1
942
943 dst = texture\_gather (uint, coord, compare)
944
945 .. opcode:: LODQ - level of detail query
946
947 Compute the LOD information that the texture pipe would use to access the
948 texture. The Y component contains the computed LOD lambda_prime. The X
949 component contains the LOD that will be accessed, based on min/max lod's
950 and mipmap filters.
951
952 .. math::
953
954 coord = src0
955
956 dst.xy = lodq(uint, coord);
957
958 .. opcode:: CLOCK - retrieve the current shader time
959
960 Invoking this instruction multiple times in the same shader should
961 cause monotonically increasing values to be returned. The values
962 are implicitly 64-bit, so if fewer than 64 bits of precision are
963 available, to provide expected wraparound semantics, the value
964 should be shifted up so that the most significant bit of the time
965 is the most significant bit of the 64-bit value.
966
967 .. math::
968
969 dst.xy = clock()
970
971
972 Integer ISA
973 ^^^^^^^^^^^^^^^^^^^^^^^^
974 These opcodes are used for integer operations.
975 Support for these opcodes indicated by PIPE_SHADER_CAP_INTEGERS (all of them?)
976
977
978 .. opcode:: I2F - Signed Integer To Float
979
980 Rounding is unspecified (round to nearest even suggested).
981
982 .. math::
983
984 dst.x = (float) src.x
985
986 dst.y = (float) src.y
987
988 dst.z = (float) src.z
989
990 dst.w = (float) src.w
991
992
993 .. opcode:: U2F - Unsigned Integer To Float
994
995 Rounding is unspecified (round to nearest even suggested).
996
997 .. math::
998
999 dst.x = (float) src.x
1000
1001 dst.y = (float) src.y
1002
1003 dst.z = (float) src.z
1004
1005 dst.w = (float) src.w
1006
1007
1008 .. opcode:: F2I - Float to Signed Integer
1009
1010 Rounding is towards zero (truncate).
1011 Values outside signed range (including NaNs) produce undefined results.
1012
1013 .. math::
1014
1015 dst.x = (int) src.x
1016
1017 dst.y = (int) src.y
1018
1019 dst.z = (int) src.z
1020
1021 dst.w = (int) src.w
1022
1023
1024 .. opcode:: F2U - Float to Unsigned Integer
1025
1026 Rounding is towards zero (truncate).
1027 Values outside unsigned range (including NaNs) produce undefined results.
1028
1029 .. math::
1030
1031 dst.x = (unsigned) src.x
1032
1033 dst.y = (unsigned) src.y
1034
1035 dst.z = (unsigned) src.z
1036
1037 dst.w = (unsigned) src.w
1038
1039
1040 .. opcode:: UADD - Integer Add
1041
1042 This instruction works the same for signed and unsigned integers.
1043 The low 32bit of the result is returned.
1044
1045 .. math::
1046
1047 dst.x = src0.x + src1.x
1048
1049 dst.y = src0.y + src1.y
1050
1051 dst.z = src0.z + src1.z
1052
1053 dst.w = src0.w + src1.w
1054
1055
1056 .. opcode:: UMAD - Integer Multiply And Add
1057
1058 This instruction works the same for signed and unsigned integers.
1059 The multiplication returns the low 32bit (as does the result itself).
1060
1061 .. math::
1062
1063 dst.x = src0.x \times src1.x + src2.x
1064
1065 dst.y = src0.y \times src1.y + src2.y
1066
1067 dst.z = src0.z \times src1.z + src2.z
1068
1069 dst.w = src0.w \times src1.w + src2.w
1070
1071
1072 .. opcode:: UMUL - Integer Multiply
1073
1074 This instruction works the same for signed and unsigned integers.
1075 The low 32bit of the result is returned.
1076
1077 .. math::
1078
1079 dst.x = src0.x \times src1.x
1080
1081 dst.y = src0.y \times src1.y
1082
1083 dst.z = src0.z \times src1.z
1084
1085 dst.w = src0.w \times src1.w
1086
1087
1088 .. opcode:: IMUL_HI - Signed Integer Multiply High Bits
1089
1090 The high 32bits of the multiplication of 2 signed integers are returned.
1091
1092 .. math::
1093
1094 dst.x = (src0.x \times src1.x) >> 32
1095
1096 dst.y = (src0.y \times src1.y) >> 32
1097
1098 dst.z = (src0.z \times src1.z) >> 32
1099
1100 dst.w = (src0.w \times src1.w) >> 32
1101
1102
1103 .. opcode:: UMUL_HI - Unsigned Integer Multiply High Bits
1104
1105 The high 32bits of the multiplication of 2 unsigned integers are returned.
1106
1107 .. math::
1108
1109 dst.x = (src0.x \times src1.x) >> 32
1110
1111 dst.y = (src0.y \times src1.y) >> 32
1112
1113 dst.z = (src0.z \times src1.z) >> 32
1114
1115 dst.w = (src0.w \times src1.w) >> 32
1116
1117
1118 .. opcode:: IDIV - Signed Integer Division
1119
1120 TBD: behavior for division by zero.
1121
1122 .. math::
1123
1124 dst.x = \frac{src0.x}{src1.x}
1125
1126 dst.y = \frac{src0.y}{src1.y}
1127
1128 dst.z = \frac{src0.z}{src1.z}
1129
1130 dst.w = \frac{src0.w}{src1.w}
1131
1132
1133 .. opcode:: UDIV - Unsigned Integer Division
1134
1135 For division by zero, 0xffffffff is returned.
1136
1137 .. math::
1138
1139 dst.x = \frac{src0.x}{src1.x}
1140
1141 dst.y = \frac{src0.y}{src1.y}
1142
1143 dst.z = \frac{src0.z}{src1.z}
1144
1145 dst.w = \frac{src0.w}{src1.w}
1146
1147
1148 .. opcode:: UMOD - Unsigned Integer Remainder
1149
1150 If second arg is zero, 0xffffffff is returned.
1151
1152 .. math::
1153
1154 dst.x = src0.x \bmod src1.x
1155
1156 dst.y = src0.y \bmod src1.y
1157
1158 dst.z = src0.z \bmod src1.z
1159
1160 dst.w = src0.w \bmod src1.w
1161
1162
1163 .. opcode:: NOT - Bitwise Not
1164
1165 .. math::
1166
1167 dst.x = \sim src.x
1168
1169 dst.y = \sim src.y
1170
1171 dst.z = \sim src.z
1172
1173 dst.w = \sim src.w
1174
1175
1176 .. opcode:: AND - Bitwise And
1177
1178 .. math::
1179
1180 dst.x = src0.x \& src1.x
1181
1182 dst.y = src0.y \& src1.y
1183
1184 dst.z = src0.z \& src1.z
1185
1186 dst.w = src0.w \& src1.w
1187
1188
1189 .. opcode:: OR - Bitwise Or
1190
1191 .. math::
1192
1193 dst.x = src0.x | src1.x
1194
1195 dst.y = src0.y | src1.y
1196
1197 dst.z = src0.z | src1.z
1198
1199 dst.w = src0.w | src1.w
1200
1201
1202 .. opcode:: XOR - Bitwise Xor
1203
1204 .. math::
1205
1206 dst.x = src0.x \oplus src1.x
1207
1208 dst.y = src0.y \oplus src1.y
1209
1210 dst.z = src0.z \oplus src1.z
1211
1212 dst.w = src0.w \oplus src1.w
1213
1214
1215 .. opcode:: IMAX - Maximum of Signed Integers
1216
1217 .. math::
1218
1219 dst.x = max(src0.x, src1.x)
1220
1221 dst.y = max(src0.y, src1.y)
1222
1223 dst.z = max(src0.z, src1.z)
1224
1225 dst.w = max(src0.w, src1.w)
1226
1227
1228 .. opcode:: UMAX - Maximum of Unsigned Integers
1229
1230 .. math::
1231
1232 dst.x = max(src0.x, src1.x)
1233
1234 dst.y = max(src0.y, src1.y)
1235
1236 dst.z = max(src0.z, src1.z)
1237
1238 dst.w = max(src0.w, src1.w)
1239
1240
1241 .. opcode:: IMIN - Minimum of Signed Integers
1242
1243 .. math::
1244
1245 dst.x = min(src0.x, src1.x)
1246
1247 dst.y = min(src0.y, src1.y)
1248
1249 dst.z = min(src0.z, src1.z)
1250
1251 dst.w = min(src0.w, src1.w)
1252
1253
1254 .. opcode:: UMIN - Minimum of Unsigned Integers
1255
1256 .. math::
1257
1258 dst.x = min(src0.x, src1.x)
1259
1260 dst.y = min(src0.y, src1.y)
1261
1262 dst.z = min(src0.z, src1.z)
1263
1264 dst.w = min(src0.w, src1.w)
1265
1266
1267 .. opcode:: SHL - Shift Left
1268
1269 The shift count is masked with 0x1f before the shift is applied.
1270
1271 .. math::
1272
1273 dst.x = src0.x << (0x1f \& src1.x)
1274
1275 dst.y = src0.y << (0x1f \& src1.y)
1276
1277 dst.z = src0.z << (0x1f \& src1.z)
1278
1279 dst.w = src0.w << (0x1f \& src1.w)
1280
1281
1282 .. opcode:: ISHR - Arithmetic Shift Right (of Signed Integer)
1283
1284 The shift count is masked with 0x1f before the shift is applied.
1285
1286 .. math::
1287
1288 dst.x = src0.x >> (0x1f \& src1.x)
1289
1290 dst.y = src0.y >> (0x1f \& src1.y)
1291
1292 dst.z = src0.z >> (0x1f \& src1.z)
1293
1294 dst.w = src0.w >> (0x1f \& src1.w)
1295
1296
1297 .. opcode:: USHR - Logical Shift Right
1298
1299 The shift count is masked with 0x1f before the shift is applied.
1300
1301 .. math::
1302
1303 dst.x = src0.x >> (unsigned) (0x1f \& src1.x)
1304
1305 dst.y = src0.y >> (unsigned) (0x1f \& src1.y)
1306
1307 dst.z = src0.z >> (unsigned) (0x1f \& src1.z)
1308
1309 dst.w = src0.w >> (unsigned) (0x1f \& src1.w)
1310
1311
1312 .. opcode:: UCMP - Integer Conditional Move
1313
1314 .. math::
1315
1316 dst.x = src0.x ? src1.x : src2.x
1317
1318 dst.y = src0.y ? src1.y : src2.y
1319
1320 dst.z = src0.z ? src1.z : src2.z
1321
1322 dst.w = src0.w ? src1.w : src2.w
1323
1324
1325
1326 .. opcode:: ISSG - Integer Set Sign
1327
1328 .. math::
1329
1330 dst.x = (src0.x < 0) ? -1 : (src0.x > 0) ? 1 : 0
1331
1332 dst.y = (src0.y < 0) ? -1 : (src0.y > 0) ? 1 : 0
1333
1334 dst.z = (src0.z < 0) ? -1 : (src0.z > 0) ? 1 : 0
1335
1336 dst.w = (src0.w < 0) ? -1 : (src0.w > 0) ? 1 : 0
1337
1338
1339
1340 .. opcode:: FSLT - Float Set On Less Than (ordered)
1341
1342 Same comparison as SLT but returns integer instead of 1.0/0.0 float
1343
1344 .. math::
1345
1346 dst.x = (src0.x < src1.x) ? \sim 0 : 0
1347
1348 dst.y = (src0.y < src1.y) ? \sim 0 : 0
1349
1350 dst.z = (src0.z < src1.z) ? \sim 0 : 0
1351
1352 dst.w = (src0.w < src1.w) ? \sim 0 : 0
1353
1354
1355 .. opcode:: ISLT - Signed Integer Set On Less Than
1356
1357 .. math::
1358
1359 dst.x = (src0.x < src1.x) ? \sim 0 : 0
1360
1361 dst.y = (src0.y < src1.y) ? \sim 0 : 0
1362
1363 dst.z = (src0.z < src1.z) ? \sim 0 : 0
1364
1365 dst.w = (src0.w < src1.w) ? \sim 0 : 0
1366
1367
1368 .. opcode:: USLT - Unsigned Integer Set On Less Than
1369
1370 .. math::
1371
1372 dst.x = (src0.x < src1.x) ? \sim 0 : 0
1373
1374 dst.y = (src0.y < src1.y) ? \sim 0 : 0
1375
1376 dst.z = (src0.z < src1.z) ? \sim 0 : 0
1377
1378 dst.w = (src0.w < src1.w) ? \sim 0 : 0
1379
1380
1381 .. opcode:: FSGE - Float Set On Greater Equal Than (ordered)
1382
1383 Same comparison as SGE but returns integer instead of 1.0/0.0 float
1384
1385 .. math::
1386
1387 dst.x = (src0.x >= src1.x) ? \sim 0 : 0
1388
1389 dst.y = (src0.y >= src1.y) ? \sim 0 : 0
1390
1391 dst.z = (src0.z >= src1.z) ? \sim 0 : 0
1392
1393 dst.w = (src0.w >= src1.w) ? \sim 0 : 0
1394
1395
1396 .. opcode:: ISGE - Signed Integer Set On Greater Equal Than
1397
1398 .. math::
1399
1400 dst.x = (src0.x >= src1.x) ? \sim 0 : 0
1401
1402 dst.y = (src0.y >= src1.y) ? \sim 0 : 0
1403
1404 dst.z = (src0.z >= src1.z) ? \sim 0 : 0
1405
1406 dst.w = (src0.w >= src1.w) ? \sim 0 : 0
1407
1408
1409 .. opcode:: USGE - Unsigned Integer Set On Greater Equal Than
1410
1411 .. math::
1412
1413 dst.x = (src0.x >= src1.x) ? \sim 0 : 0
1414
1415 dst.y = (src0.y >= src1.y) ? \sim 0 : 0
1416
1417 dst.z = (src0.z >= src1.z) ? \sim 0 : 0
1418
1419 dst.w = (src0.w >= src1.w) ? \sim 0 : 0
1420
1421
1422 .. opcode:: FSEQ - Float Set On Equal (ordered)
1423
1424 Same comparison as SEQ but returns integer instead of 1.0/0.0 float
1425
1426 .. math::
1427
1428 dst.x = (src0.x == src1.x) ? \sim 0 : 0
1429
1430 dst.y = (src0.y == src1.y) ? \sim 0 : 0
1431
1432 dst.z = (src0.z == src1.z) ? \sim 0 : 0
1433
1434 dst.w = (src0.w == src1.w) ? \sim 0 : 0
1435
1436
1437 .. opcode:: USEQ - Integer Set On Equal
1438
1439 .. math::
1440
1441 dst.x = (src0.x == src1.x) ? \sim 0 : 0
1442
1443 dst.y = (src0.y == src1.y) ? \sim 0 : 0
1444
1445 dst.z = (src0.z == src1.z) ? \sim 0 : 0
1446
1447 dst.w = (src0.w == src1.w) ? \sim 0 : 0
1448
1449
1450 .. opcode:: FSNE - Float Set On Not Equal (unordered)
1451
1452 Same comparison as SNE but returns integer instead of 1.0/0.0 float
1453
1454 .. math::
1455
1456 dst.x = (src0.x != src1.x) ? \sim 0 : 0
1457
1458 dst.y = (src0.y != src1.y) ? \sim 0 : 0
1459
1460 dst.z = (src0.z != src1.z) ? \sim 0 : 0
1461
1462 dst.w = (src0.w != src1.w) ? \sim 0 : 0
1463
1464
1465 .. opcode:: USNE - Integer Set On Not Equal
1466
1467 .. math::
1468
1469 dst.x = (src0.x != src1.x) ? \sim 0 : 0
1470
1471 dst.y = (src0.y != src1.y) ? \sim 0 : 0
1472
1473 dst.z = (src0.z != src1.z) ? \sim 0 : 0
1474
1475 dst.w = (src0.w != src1.w) ? \sim 0 : 0
1476
1477
1478 .. opcode:: INEG - Integer Negate
1479
1480 Two's complement.
1481
1482 .. math::
1483
1484 dst.x = -src.x
1485
1486 dst.y = -src.y
1487
1488 dst.z = -src.z
1489
1490 dst.w = -src.w
1491
1492
1493 .. opcode:: IABS - Integer Absolute Value
1494
1495 .. math::
1496
1497 dst.x = |src.x|
1498
1499 dst.y = |src.y|
1500
1501 dst.z = |src.z|
1502
1503 dst.w = |src.w|
1504
1505 Bitwise ISA
1506 ^^^^^^^^^^^
1507 These opcodes are used for bit-level manipulation of integers.
1508
1509 .. opcode:: IBFE - Signed Bitfield Extract
1510
1511 Like GLSL bitfieldExtract. Extracts a set of bits from the input, and
1512 sign-extends them if the high bit of the extracted window is set.
1513
1514 Pseudocode::
1515
1516 def ibfe(value, offset, bits):
1517 if offset < 0 or bits < 0 or offset + bits > 32:
1518 return undefined
1519 if bits == 0: return 0
1520 # Note: >> sign-extends
1521 return (value << (32 - offset - bits)) >> (32 - bits)
1522
1523 .. opcode:: UBFE - Unsigned Bitfield Extract
1524
1525 Like GLSL bitfieldExtract. Extracts a set of bits from the input, without
1526 any sign-extension.
1527
1528 Pseudocode::
1529
1530 def ubfe(value, offset, bits):
1531 if offset < 0 or bits < 0 or offset + bits > 32:
1532 return undefined
1533 if bits == 0: return 0
1534 # Note: >> does not sign-extend
1535 return (value << (32 - offset - bits)) >> (32 - bits)
1536
1537 .. opcode:: BFI - Bitfield Insert
1538
1539 Like GLSL bitfieldInsert. Replaces a bit region of 'base' with the low bits
1540 of 'insert'.
1541
1542 Pseudocode::
1543
1544 def bfi(base, insert, offset, bits):
1545 if offset < 0 or bits < 0 or offset + bits > 32:
1546 return undefined
1547 # << defined such that mask == ~0 when bits == 32, offset == 0
1548 mask = ((1 << bits) - 1) << offset
1549 return ((insert << offset) & mask) | (base & ~mask)
1550
1551 .. opcode:: BREV - Bitfield Reverse
1552
1553 See SM5 instruction BFREV. Reverses the bits of the argument.
1554
1555 .. opcode:: POPC - Population Count
1556
1557 See SM5 instruction COUNTBITS. Counts the number of set bits in the argument.
1558
1559 .. opcode:: LSB - Index of lowest set bit
1560
1561 See SM5 instruction FIRSTBIT_LO. Computes the 0-based index of the first set
1562 bit of the argument. Returns -1 if none are set.
1563
1564 .. opcode:: IMSB - Index of highest non-sign bit
1565
1566 See SM5 instruction FIRSTBIT_SHI. Computes the 0-based index of the highest
1567 non-sign bit of the argument (i.e. highest 0 bit for negative numbers,
1568 highest 1 bit for positive numbers). Returns -1 if all bits are the same
1569 (i.e. for inputs 0 and -1).
1570
1571 .. opcode:: UMSB - Index of highest set bit
1572
1573 See SM5 instruction FIRSTBIT_HI. Computes the 0-based index of the highest
1574 set bit of the argument. Returns -1 if none are set.
1575
1576 Geometry ISA
1577 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
1578
1579 These opcodes are only supported in geometry shaders; they have no meaning
1580 in any other type of shader.
1581
1582 .. opcode:: EMIT - Emit
1583
1584 Generate a new vertex for the current primitive into the specified vertex
1585 stream using the values in the output registers.
1586
1587
1588 .. opcode:: ENDPRIM - End Primitive
1589
1590 Complete the current primitive in the specified vertex stream (consisting of
1591 the emitted vertices), and start a new one.
1592
1593
1594 GLSL ISA
1595 ^^^^^^^^^^
1596
1597 These opcodes are part of :term:`GLSL`'s opcode set. Support for these
1598 opcodes is determined by a special capability bit, ``GLSL``.
1599 Some require glsl version 1.30 (UIF/BREAKC/SWITCH/CASE/DEFAULT/ENDSWITCH).
1600
1601 .. opcode:: CAL - Subroutine Call
1602
1603 push(pc)
1604 pc = target
1605
1606
1607 .. opcode:: RET - Subroutine Call Return
1608
1609 pc = pop()
1610
1611
1612 .. opcode:: CONT - Continue
1613
1614 Unconditionally moves the point of execution to the instruction after the
1615 last bgnloop. The instruction must appear within a bgnloop/endloop.
1616
1617 .. note::
1618
1619 Support for CONT is determined by a special capability bit,
1620 ``TGSI_CONT_SUPPORTED``. See :ref:`Screen` for more information.
1621
1622
1623 .. opcode:: BGNLOOP - Begin a Loop
1624
1625 Start a loop. Must have a matching endloop.
1626
1627
1628 .. opcode:: BGNSUB - Begin Subroutine
1629
1630 Starts definition of a subroutine. Must have a matching endsub.
1631
1632
1633 .. opcode:: ENDLOOP - End a Loop
1634
1635 End a loop started with bgnloop.
1636
1637
1638 .. opcode:: ENDSUB - End Subroutine
1639
1640 Ends definition of a subroutine.
1641
1642
1643 .. opcode:: NOP - No Operation
1644
1645 Do nothing.
1646
1647
1648 .. opcode:: BRK - Break
1649
1650 Unconditionally moves the point of execution to the instruction after the
1651 next endloop or endswitch. The instruction must appear within a loop/endloop
1652 or switch/endswitch.
1653
1654
1655 .. opcode:: BREAKC - Break Conditional
1656
1657 Conditionally moves the point of execution to the instruction after the
1658 next endloop or endswitch. The instruction must appear within a loop/endloop
1659 or switch/endswitch.
1660 Condition evaluates to true if src0.x != 0 where src0.x is interpreted
1661 as an integer register.
1662
1663 .. note::
1664
1665 Considered for removal as it's quite inconsistent wrt other opcodes
1666 (could emulate with UIF/BRK/ENDIF).
1667
1668
1669 .. opcode:: IF - Float If
1670
1671 Start an IF ... ELSE .. ENDIF block. Condition evaluates to true if
1672
1673 src0.x != 0.0
1674
1675 where src0.x is interpreted as a floating point register.
1676
1677
1678 .. opcode:: UIF - Bitwise If
1679
1680 Start an UIF ... ELSE .. ENDIF block. Condition evaluates to true if
1681
1682 src0.x != 0
1683
1684 where src0.x is interpreted as an integer register.
1685
1686
1687 .. opcode:: ELSE - Else
1688
1689 Starts an else block, after an IF or UIF statement.
1690
1691
1692 .. opcode:: ENDIF - End If
1693
1694 Ends an IF or UIF block.
1695
1696
1697 .. opcode:: SWITCH - Switch
1698
1699 Starts a C-style switch expression. The switch consists of one or multiple
1700 CASE statements, and at most one DEFAULT statement. Execution of a statement
1701 ends when a BRK is hit, but just like in C falling through to other cases
1702 without a break is allowed. Similarly, DEFAULT label is allowed anywhere not
1703 just as last statement, and fallthrough is allowed into/from it.
1704 CASE src arguments are evaluated at bit level against the SWITCH src argument.
1705
1706 Example::
1707
1708 SWITCH src[0].x
1709 CASE src[0].x
1710 (some instructions here)
1711 (optional BRK here)
1712 DEFAULT
1713 (some instructions here)
1714 (optional BRK here)
1715 CASE src[0].x
1716 (some instructions here)
1717 (optional BRK here)
1718 ENDSWITCH
1719
1720
1721 .. opcode:: CASE - Switch case
1722
1723 This represents a switch case label. The src arg must be an integer immediate.
1724
1725
1726 .. opcode:: DEFAULT - Switch default
1727
1728 This represents the default case in the switch, which is taken if no other
1729 case matches.
1730
1731
1732 .. opcode:: ENDSWITCH - End of switch
1733
1734 Ends a switch expression.
1735
1736
1737 Interpolation ISA
1738 ^^^^^^^^^^^^^^^^^
1739
1740 The interpolation instructions allow an input to be interpolated in a
1741 different way than its declaration. This corresponds to the GLSL 4.00
1742 interpolateAt* functions. The first argument of each of these must come from
1743 ``TGSI_FILE_INPUT``.
1744
1745 .. opcode:: INTERP_CENTROID - Interpolate at the centroid
1746
1747 Interpolates the varying specified by src0 at the centroid
1748
1749 .. opcode:: INTERP_SAMPLE - Interpolate at the specified sample
1750
1751 Interpolates the varying specified by src0 at the sample id specified by
1752 src1.x (interpreted as an integer)
1753
1754 .. opcode:: INTERP_OFFSET - Interpolate at the specified offset
1755
1756 Interpolates the varying specified by src0 at the offset src1.xy from the
1757 pixel center (interpreted as floats)
1758
1759
1760 .. _doubleopcodes:
1761
1762 Double ISA
1763 ^^^^^^^^^^^^^^^
1764
1765 The double-precision opcodes reinterpret four-component vectors into
1766 two-component vectors with doubled precision in each component.
1767
1768 .. opcode:: DABS - Absolute
1769
1770 .. math::
1771
1772 dst.xy = |src0.xy|
1773
1774 dst.zw = |src0.zw|
1775
1776 .. opcode:: DADD - Add
1777
1778 .. math::
1779
1780 dst.xy = src0.xy + src1.xy
1781
1782 dst.zw = src0.zw + src1.zw
1783
1784 .. opcode:: DSEQ - Set on Equal
1785
1786 .. math::
1787
1788 dst.x = src0.xy == src1.xy ? \sim 0 : 0
1789
1790 dst.z = src0.zw == src1.zw ? \sim 0 : 0
1791
1792 .. opcode:: DSNE - Set on Equal
1793
1794 .. math::
1795
1796 dst.x = src0.xy != src1.xy ? \sim 0 : 0
1797
1798 dst.z = src0.zw != src1.zw ? \sim 0 : 0
1799
1800 .. opcode:: DSLT - Set on Less than
1801
1802 .. math::
1803
1804 dst.x = src0.xy < src1.xy ? \sim 0 : 0
1805
1806 dst.z = src0.zw < src1.zw ? \sim 0 : 0
1807
1808 .. opcode:: DSGE - Set on Greater equal
1809
1810 .. math::
1811
1812 dst.x = src0.xy >= src1.xy ? \sim 0 : 0
1813
1814 dst.z = src0.zw >= src1.zw ? \sim 0 : 0
1815
1816 .. opcode:: DFRAC - Fraction
1817
1818 .. math::
1819
1820 dst.xy = src.xy - \lfloor src.xy\rfloor
1821
1822 dst.zw = src.zw - \lfloor src.zw\rfloor
1823
1824 .. opcode:: DTRUNC - Truncate
1825
1826 .. math::
1827
1828 dst.xy = trunc(src.xy)
1829
1830 dst.zw = trunc(src.zw)
1831
1832 .. opcode:: DCEIL - Ceiling
1833
1834 .. math::
1835
1836 dst.xy = \lceil src.xy\rceil
1837
1838 dst.zw = \lceil src.zw\rceil
1839
1840 .. opcode:: DFLR - Floor
1841
1842 .. math::
1843
1844 dst.xy = \lfloor src.xy\rfloor
1845
1846 dst.zw = \lfloor src.zw\rfloor
1847
1848 .. opcode:: DROUND - Fraction
1849
1850 .. math::
1851
1852 dst.xy = round(src.xy)
1853
1854 dst.zw = round(src.zw)
1855
1856 .. opcode:: DSSG - Set Sign
1857
1858 .. math::
1859
1860 dst.xy = (src.xy > 0) ? 1.0 : (src.xy < 0) ? -1.0 : 0.0
1861
1862 dst.zw = (src.zw > 0) ? 1.0 : (src.zw < 0) ? -1.0 : 0.0
1863
1864 .. opcode:: DFRACEXP - Convert Number to Fractional and Integral Components
1865
1866 Like the ``frexp()`` routine in many math libraries, this opcode stores the
1867 exponent of its source to ``dst0``, and the significand to ``dst1``, such that
1868 :math:`dst1 \times 2^{dst0} = src` .
1869
1870 .. math::
1871
1872 dst0.xy = exp(src.xy)
1873
1874 dst1.xy = frac(src.xy)
1875
1876 dst0.zw = exp(src.zw)
1877
1878 dst1.zw = frac(src.zw)
1879
1880 .. opcode:: DLDEXP - Multiply Number by Integral Power of 2
1881
1882 This opcode is the inverse of :opcode:`DFRACEXP`. The second
1883 source is an integer.
1884
1885 .. math::
1886
1887 dst.xy = src0.xy \times 2^{src1.x}
1888
1889 dst.zw = src0.zw \times 2^{src1.y}
1890
1891 .. opcode:: DMIN - Minimum
1892
1893 .. math::
1894
1895 dst.xy = min(src0.xy, src1.xy)
1896
1897 dst.zw = min(src0.zw, src1.zw)
1898
1899 .. opcode:: DMAX - Maximum
1900
1901 .. math::
1902
1903 dst.xy = max(src0.xy, src1.xy)
1904
1905 dst.zw = max(src0.zw, src1.zw)
1906
1907 .. opcode:: DMUL - Multiply
1908
1909 .. math::
1910
1911 dst.xy = src0.xy \times src1.xy
1912
1913 dst.zw = src0.zw \times src1.zw
1914
1915
1916 .. opcode:: DMAD - Multiply And Add
1917
1918 .. math::
1919
1920 dst.xy = src0.xy \times src1.xy + src2.xy
1921
1922 dst.zw = src0.zw \times src1.zw + src2.zw
1923
1924
1925 .. opcode:: DFMA - Fused Multiply-Add
1926
1927 Perform a * b + c with no intermediate rounding step.
1928
1929 .. math::
1930
1931 dst.xy = src0.xy \times src1.xy + src2.xy
1932
1933 dst.zw = src0.zw \times src1.zw + src2.zw
1934
1935
1936 .. opcode:: DDIV - Divide
1937
1938 .. math::
1939
1940 dst.xy = \frac{src0.xy}{src1.xy}
1941
1942 dst.zw = \frac{src0.zw}{src1.zw}
1943
1944
1945 .. opcode:: DRCP - Reciprocal
1946
1947 .. math::
1948
1949 dst.xy = \frac{1}{src.xy}
1950
1951 dst.zw = \frac{1}{src.zw}
1952
1953 .. opcode:: DSQRT - Square Root
1954
1955 .. math::
1956
1957 dst.xy = \sqrt{src.xy}
1958
1959 dst.zw = \sqrt{src.zw}
1960
1961 .. opcode:: DRSQ - Reciprocal Square Root
1962
1963 .. math::
1964
1965 dst.xy = \frac{1}{\sqrt{src.xy}}
1966
1967 dst.zw = \frac{1}{\sqrt{src.zw}}
1968
1969 .. opcode:: F2D - Float to Double
1970
1971 .. math::
1972
1973 dst.xy = double(src0.x)
1974
1975 dst.zw = double(src0.y)
1976
1977 .. opcode:: D2F - Double to Float
1978
1979 .. math::
1980
1981 dst.x = float(src0.xy)
1982
1983 dst.y = float(src0.zw)
1984
1985 .. opcode:: I2D - Int to Double
1986
1987 .. math::
1988
1989 dst.xy = double(src0.x)
1990
1991 dst.zw = double(src0.y)
1992
1993 .. opcode:: D2I - Double to Int
1994
1995 .. math::
1996
1997 dst.x = int(src0.xy)
1998
1999 dst.y = int(src0.zw)
2000
2001 .. opcode:: U2D - Unsigned Int to Double
2002
2003 .. math::
2004
2005 dst.xy = double(src0.x)
2006
2007 dst.zw = double(src0.y)
2008
2009 .. opcode:: D2U - Double to Unsigned Int
2010
2011 .. math::
2012
2013 dst.x = unsigned(src0.xy)
2014
2015 dst.y = unsigned(src0.zw)
2016
2017 64-bit Integer ISA
2018 ^^^^^^^^^^^^^^^^^^
2019
2020 The 64-bit integer opcodes reinterpret four-component vectors into
2021 two-component vectors with 64-bits in each component.
2022
2023 .. opcode:: I64ABS - 64-bit Integer Absolute Value
2024
2025 .. math::
2026
2027 dst.xy = |src0.xy|
2028
2029 dst.zw = |src0.zw|
2030
2031 .. opcode:: I64NEG - 64-bit Integer Negate
2032
2033 Two's complement.
2034
2035 .. math::
2036
2037 dst.xy = -src.xy
2038
2039 dst.zw = -src.zw
2040
2041 .. opcode:: I64SSG - 64-bit Integer Set Sign
2042
2043 .. math::
2044
2045 dst.xy = (src0.xy < 0) ? -1 : (src0.xy > 0) ? 1 : 0
2046
2047 dst.zw = (src0.zw < 0) ? -1 : (src0.zw > 0) ? 1 : 0
2048
2049 .. opcode:: U64ADD - 64-bit Integer Add
2050
2051 .. math::
2052
2053 dst.xy = src0.xy + src1.xy
2054
2055 dst.zw = src0.zw + src1.zw
2056
2057 .. opcode:: U64MUL - 64-bit Integer Multiply
2058
2059 .. math::
2060
2061 dst.xy = src0.xy * src1.xy
2062
2063 dst.zw = src0.zw * src1.zw
2064
2065 .. opcode:: U64SEQ - 64-bit Integer Set on Equal
2066
2067 .. math::
2068
2069 dst.x = src0.xy == src1.xy ? \sim 0 : 0
2070
2071 dst.z = src0.zw == src1.zw ? \sim 0 : 0
2072
2073 .. opcode:: U64SNE - 64-bit Integer Set on Not Equal
2074
2075 .. math::
2076
2077 dst.x = src0.xy != src1.xy ? \sim 0 : 0
2078
2079 dst.z = src0.zw != src1.zw ? \sim 0 : 0
2080
2081 .. opcode:: U64SLT - 64-bit Unsigned Integer Set on Less Than
2082
2083 .. math::
2084
2085 dst.x = src0.xy < src1.xy ? \sim 0 : 0
2086
2087 dst.z = src0.zw < src1.zw ? \sim 0 : 0
2088
2089 .. opcode:: U64SGE - 64-bit Unsigned Integer Set on Greater Equal
2090
2091 .. math::
2092
2093 dst.x = src0.xy >= src1.xy ? \sim 0 : 0
2094
2095 dst.z = src0.zw >= src1.zw ? \sim 0 : 0
2096
2097 .. opcode:: I64SLT - 64-bit Signed Integer Set on Less Than
2098
2099 .. math::
2100
2101 dst.x = src0.xy < src1.xy ? \sim 0 : 0
2102
2103 dst.z = src0.zw < src1.zw ? \sim 0 : 0
2104
2105 .. opcode:: I64SGE - 64-bit Signed Integer Set on Greater Equal
2106
2107 .. math::
2108
2109 dst.x = src0.xy >= src1.xy ? \sim 0 : 0
2110
2111 dst.z = src0.zw >= src1.zw ? \sim 0 : 0
2112
2113 .. opcode:: I64MIN - Minimum of 64-bit Signed Integers
2114
2115 .. math::
2116
2117 dst.xy = min(src0.xy, src1.xy)
2118
2119 dst.zw = min(src0.zw, src1.zw)
2120
2121 .. opcode:: U64MIN - Minimum of 64-bit Unsigned Integers
2122
2123 .. math::
2124
2125 dst.xy = min(src0.xy, src1.xy)
2126
2127 dst.zw = min(src0.zw, src1.zw)
2128
2129 .. opcode:: I64MAX - Maximum of 64-bit Signed Integers
2130
2131 .. math::
2132
2133 dst.xy = max(src0.xy, src1.xy)
2134
2135 dst.zw = max(src0.zw, src1.zw)
2136
2137 .. opcode:: U64MAX - Maximum of 64-bit Unsigned Integers
2138
2139 .. math::
2140
2141 dst.xy = max(src0.xy, src1.xy)
2142
2143 dst.zw = max(src0.zw, src1.zw)
2144
2145 .. opcode:: U64SHL - Shift Left 64-bit Unsigned Integer
2146
2147 The shift count is masked with 0x3f before the shift is applied.
2148
2149 .. math::
2150
2151 dst.xy = src0.xy << (0x3f \& src1.x)
2152
2153 dst.zw = src0.zw << (0x3f \& src1.y)
2154
2155 .. opcode:: I64SHR - Arithmetic Shift Right (of 64-bit Signed Integer)
2156
2157 The shift count is masked with 0x3f before the shift is applied.
2158
2159 .. math::
2160
2161 dst.xy = src0.xy >> (0x3f \& src1.x)
2162
2163 dst.zw = src0.zw >> (0x3f \& src1.y)
2164
2165 .. opcode:: U64SHR - Logical Shift Right (of 64-bit Unsigned Integer)
2166
2167 The shift count is masked with 0x3f before the shift is applied.
2168
2169 .. math::
2170
2171 dst.xy = src0.xy >> (unsigned) (0x3f \& src1.x)
2172
2173 dst.zw = src0.zw >> (unsigned) (0x3f \& src1.y)
2174
2175 .. opcode:: I64DIV - 64-bit Signed Integer Division
2176
2177 .. math::
2178
2179 dst.xy = \frac{src0.xy}{src1.xy}
2180
2181 dst.zw = \frac{src0.zw}{src1.zw}
2182
2183 .. opcode:: U64DIV - 64-bit Unsigned Integer Division
2184
2185 .. math::
2186
2187 dst.xy = \frac{src0.xy}{src1.xy}
2188
2189 dst.zw = \frac{src0.zw}{src1.zw}
2190
2191 .. opcode:: U64MOD - 64-bit Unsigned Integer Remainder
2192
2193 .. math::
2194
2195 dst.xy = src0.xy \bmod src1.xy
2196
2197 dst.zw = src0.zw \bmod src1.zw
2198
2199 .. opcode:: I64MOD - 64-bit Signed Integer Remainder
2200
2201 .. math::
2202
2203 dst.xy = src0.xy \bmod src1.xy
2204
2205 dst.zw = src0.zw \bmod src1.zw
2206
2207 .. opcode:: F2U64 - Float to 64-bit Unsigned Int
2208
2209 .. math::
2210
2211 dst.xy = (uint64_t) src0.x
2212
2213 dst.zw = (uint64_t) src0.y
2214
2215 .. opcode:: F2I64 - Float to 64-bit Int
2216
2217 .. math::
2218
2219 dst.xy = (int64_t) src0.x
2220
2221 dst.zw = (int64_t) src0.y
2222
2223 .. opcode:: U2I64 - Unsigned Integer to 64-bit Integer
2224
2225 This is a zero extension.
2226
2227 .. math::
2228
2229 dst.xy = (uint64_t) src0.x
2230
2231 dst.zw = (uint64_t) src0.y
2232
2233 .. opcode:: I2I64 - Signed Integer to 64-bit Integer
2234
2235 This is a sign extension.
2236
2237 .. math::
2238
2239 dst.xy = (int64_t) src0.x
2240
2241 dst.zw = (int64_t) src0.y
2242
2243 .. opcode:: D2U64 - Double to 64-bit Unsigned Int
2244
2245 .. math::
2246
2247 dst.xy = (uint64_t) src0.xy
2248
2249 dst.zw = (uint64_t) src0.zw
2250
2251 .. opcode:: D2I64 - Double to 64-bit Int
2252
2253 .. math::
2254
2255 dst.xy = (int64_t) src0.xy
2256
2257 dst.zw = (int64_t) src0.zw
2258
2259 .. opcode:: U642F - 64-bit unsigned integer to float
2260
2261 .. math::
2262
2263 dst.x = (float) src0.xy
2264
2265 dst.y = (float) src0.zw
2266
2267 .. opcode:: I642F - 64-bit Int to Float
2268
2269 .. math::
2270
2271 dst.x = (float) src0.xy
2272
2273 dst.y = (float) src0.zw
2274
2275 .. opcode:: U642D - 64-bit unsigned integer to double
2276
2277 .. math::
2278
2279 dst.xy = (double) src0.xy
2280
2281 dst.zw = (double) src0.zw
2282
2283 .. opcode:: I642D - 64-bit Int to double
2284
2285 .. math::
2286
2287 dst.xy = (double) src0.xy
2288
2289 dst.zw = (double) src0.zw
2290
2291 .. _samplingopcodes:
2292
2293 Resource Sampling Opcodes
2294 ^^^^^^^^^^^^^^^^^^^^^^^^^
2295
2296 Those opcodes follow very closely semantics of the respective Direct3D
2297 instructions. If in doubt double check Direct3D documentation.
2298 Note that the swizzle on SVIEW (src1) determines texel swizzling
2299 after lookup.
2300
2301 .. opcode:: SAMPLE
2302
2303 Using provided address, sample data from the specified texture using the
2304 filtering mode identified by the given sampler. The source data may come from
2305 any resource type other than buffers.
2306
2307 Syntax: ``SAMPLE dst, address, sampler_view, sampler``
2308
2309 Example: ``SAMPLE TEMP[0], TEMP[1], SVIEW[0], SAMP[0]``
2310
2311 .. opcode:: SAMPLE_I
2312
2313 Simplified alternative to the SAMPLE instruction. Using the provided
2314 integer address, SAMPLE_I fetches data from the specified sampler view
2315 without any filtering. The source data may come from any resource type
2316 other than CUBE.
2317
2318 Syntax: ``SAMPLE_I dst, address, sampler_view``
2319
2320 Example: ``SAMPLE_I TEMP[0], TEMP[1], SVIEW[0]``
2321
2322 The 'address' is specified as unsigned integers. If the 'address' is out of
2323 range [0...(# texels - 1)] the result of the fetch is always 0 in all
2324 components. As such the instruction doesn't honor address wrap modes, in
2325 cases where that behavior is desirable 'SAMPLE' instruction should be used.
2326 address.w always provides an unsigned integer mipmap level. If the value is
2327 out of the range then the instruction always returns 0 in all components.
2328 address.yz are ignored for buffers and 1d textures. address.z is ignored
2329 for 1d texture arrays and 2d textures.
2330
2331 For 1D texture arrays address.y provides the array index (also as unsigned
2332 integer). If the value is out of the range of available array indices
2333 [0... (array size - 1)] then the opcode always returns 0 in all components.
2334 For 2D texture arrays address.z provides the array index, otherwise it
2335 exhibits the same behavior as in the case for 1D texture arrays. The exact
2336 semantics of the source address are presented in the table below:
2337
2338 +---------------------------+----+-----+-----+---------+
2339 | resource type | X | Y | Z | W |
2340 +===========================+====+=====+=====+=========+
2341 | ``PIPE_BUFFER`` | x | | | ignored |
2342 +---------------------------+----+-----+-----+---------+
2343 | ``PIPE_TEXTURE_1D`` | x | | | mpl |
2344 +---------------------------+----+-----+-----+---------+
2345 | ``PIPE_TEXTURE_2D`` | x | y | | mpl |
2346 +---------------------------+----+-----+-----+---------+
2347 | ``PIPE_TEXTURE_3D`` | x | y | z | mpl |
2348 +---------------------------+----+-----+-----+---------+
2349 | ``PIPE_TEXTURE_RECT`` | x | y | | mpl |
2350 +---------------------------+----+-----+-----+---------+
2351 | ``PIPE_TEXTURE_CUBE`` | not allowed as source |
2352 +---------------------------+----+-----+-----+---------+
2353 | ``PIPE_TEXTURE_1D_ARRAY`` | x | idx | | mpl |
2354 +---------------------------+----+-----+-----+---------+
2355 | ``PIPE_TEXTURE_2D_ARRAY`` | x | y | idx | mpl |
2356 +---------------------------+----+-----+-----+---------+
2357
2358 Where 'mpl' is a mipmap level and 'idx' is the array index.
2359
2360 .. opcode:: SAMPLE_I_MS
2361
2362 Just like SAMPLE_I but allows fetch data from multi-sampled surfaces.
2363
2364 Syntax: ``SAMPLE_I_MS dst, address, sampler_view, sample``
2365
2366 .. opcode:: SAMPLE_B
2367
2368 Just like the SAMPLE instruction with the exception that an additional bias
2369 is applied to the level of detail computed as part of the instruction
2370 execution.
2371
2372 Syntax: ``SAMPLE_B dst, address, sampler_view, sampler, lod_bias``
2373
2374 Example: ``SAMPLE_B TEMP[0], TEMP[1], SVIEW[0], SAMP[0], TEMP[2].x``
2375
2376 .. opcode:: SAMPLE_C
2377
2378 Similar to the SAMPLE instruction but it performs a comparison filter. The
2379 operands to SAMPLE_C are identical to SAMPLE, except that there is an
2380 additional float32 operand, reference value, which must be a register with
2381 single-component, or a scalar literal. SAMPLE_C makes the hardware use the
2382 current samplers compare_func (in pipe_sampler_state) to compare reference
2383 value against the red component value for the surce resource at each texel
2384 that the currently configured texture filter covers based on the provided
2385 coordinates.
2386
2387 Syntax: ``SAMPLE_C dst, address, sampler_view.r, sampler, ref_value``
2388
2389 Example: ``SAMPLE_C TEMP[0], TEMP[1], SVIEW[0].r, SAMP[0], TEMP[2].x``
2390
2391 .. opcode:: SAMPLE_C_LZ
2392
2393 Same as SAMPLE_C, but LOD is 0 and derivatives are ignored. The LZ stands
2394 for level-zero.
2395
2396 Syntax: ``SAMPLE_C_LZ dst, address, sampler_view.r, sampler, ref_value``
2397
2398 Example: ``SAMPLE_C_LZ TEMP[0], TEMP[1], SVIEW[0].r, SAMP[0], TEMP[2].x``
2399
2400
2401 .. opcode:: SAMPLE_D
2402
2403 SAMPLE_D is identical to the SAMPLE opcode except that the derivatives for
2404 the source address in the x direction and the y direction are provided by
2405 extra parameters.
2406
2407 Syntax: ``SAMPLE_D dst, address, sampler_view, sampler, der_x, der_y``
2408
2409 Example: ``SAMPLE_D TEMP[0], TEMP[1], SVIEW[0], SAMP[0], TEMP[2], TEMP[3]``
2410
2411 .. opcode:: SAMPLE_L
2412
2413 SAMPLE_L is identical to the SAMPLE opcode except that the LOD is provided
2414 directly as a scalar value, representing no anisotropy.
2415
2416 Syntax: ``SAMPLE_L dst, address, sampler_view, sampler, explicit_lod``
2417
2418 Example: ``SAMPLE_L TEMP[0], TEMP[1], SVIEW[0], SAMP[0], TEMP[2].x``
2419
2420 .. opcode:: GATHER4
2421
2422 Gathers the four texels to be used in a bi-linear filtering operation and
2423 packs them into a single register. Only works with 2D, 2D array, cubemaps,
2424 and cubemaps arrays. For 2D textures, only the addressing modes of the
2425 sampler and the top level of any mip pyramid are used. Set W to zero. It
2426 behaves like the SAMPLE instruction, but a filtered sample is not
2427 generated. The four samples that contribute to filtering are placed into
2428 xyzw in counter-clockwise order, starting with the (u,v) texture coordinate
2429 delta at the following locations (-, +), (+, +), (+, -), (-, -), where the
2430 magnitude of the deltas are half a texel.
2431
2432
2433 .. opcode:: SVIEWINFO
2434
2435 Query the dimensions of a given sampler view. dst receives width, height,
2436 depth or array size and number of mipmap levels as int4. The dst can have a
2437 writemask which will specify what info is the caller interested in.
2438
2439 Syntax: ``SVIEWINFO dst, src_mip_level, sampler_view``
2440
2441 Example: ``SVIEWINFO TEMP[0], TEMP[1].x, SVIEW[0]``
2442
2443 src_mip_level is an unsigned integer scalar. If it's out of range then
2444 returns 0 for width, height and depth/array size but the total number of
2445 mipmap is still returned correctly for the given sampler view. The returned
2446 width, height and depth values are for the mipmap level selected by the
2447 src_mip_level and are in the number of texels. For 1d texture array width
2448 is in dst.x, array size is in dst.y and dst.z is 0. The number of mipmaps is
2449 still in dst.w. In contrast to d3d10 resinfo, there's no way in the tgsi
2450 instruction encoding to specify the return type (float/rcpfloat/uint), hence
2451 always using uint. Also, unlike the SAMPLE instructions, the swizzle on src1
2452 resinfo allowing swizzling dst values is ignored (due to the interaction
2453 with rcpfloat modifier which requires some swizzle handling in the state
2454 tracker anyway).
2455
2456 .. opcode:: SAMPLE_POS
2457
2458 Query the position of a sample in the given resource or render target
2459 when per-sample fragment shading is in effect.
2460
2461 Syntax: ``SAMPLE_POS dst, source, sample_index``
2462
2463 dst receives float4 (x, y, undef, undef) indicated where the sample is
2464 located. Sample locations are in the range [0, 1] where 0.5 is the center
2465 of the fragment.
2466
2467 source is either a sampler view (to indicate a shader resource) or temp
2468 register (to indicate the render target). The source register may have
2469 an optional swizzle to apply to the returned result
2470
2471 sample_index is an integer scalar indicating which sample position is to
2472 be queried.
2473
2474 If per-sample shading is not in effect or the source resource or render
2475 target is not multisampled, the result is (0.5, 0.5, undef, undef).
2476
2477 NOTE: no driver has implemented this opcode yet (and no state tracker
2478 emits it). This information is subject to change.
2479
2480 .. opcode:: SAMPLE_INFO
2481
2482 Query the number of samples in a multisampled resource or render target.
2483
2484 Syntax: ``SAMPLE_INFO dst, source``
2485
2486 dst receives int4 (n, 0, 0, 0) where n is the number of samples in a
2487 resource or the render target.
2488
2489 source is either a sampler view (to indicate a shader resource) or temp
2490 register (to indicate the render target). The source register may have
2491 an optional swizzle to apply to the returned result
2492
2493 If per-sample shading is not in effect or the source resource or render
2494 target is not multisampled, the result is (1, 0, 0, 0).
2495
2496 NOTE: no driver has implemented this opcode yet (and no state tracker
2497 emits it). This information is subject to change.
2498
2499 .. _resourceopcodes:
2500
2501 Resource Access Opcodes
2502 ^^^^^^^^^^^^^^^^^^^^^^^
2503
2504 For these opcodes, the resource can be a BUFFER, IMAGE, or MEMORY.
2505
2506 .. opcode:: LOAD - Fetch data from a shader buffer or image
2507
2508 Syntax: ``LOAD dst, resource, address``
2509
2510 Example: ``LOAD TEMP[0], BUFFER[0], TEMP[1]``
2511
2512 Using the provided integer address, LOAD fetches data
2513 from the specified buffer or texture without any
2514 filtering.
2515
2516 The 'address' is specified as a vector of unsigned
2517 integers. If the 'address' is out of range the result
2518 is unspecified.
2519
2520 Only the first mipmap level of a resource can be read
2521 from using this instruction.
2522
2523 For 1D or 2D texture arrays, the array index is
2524 provided as an unsigned integer in address.y or
2525 address.z, respectively. address.yz are ignored for
2526 buffers and 1D textures. address.z is ignored for 1D
2527 texture arrays and 2D textures. address.w is always
2528 ignored.
2529
2530 A swizzle suffix may be added to the resource argument
2531 this will cause the resource data to be swizzled accordingly.
2532
2533 .. opcode:: STORE - Write data to a shader resource
2534
2535 Syntax: ``STORE resource, address, src``
2536
2537 Example: ``STORE BUFFER[0], TEMP[0], TEMP[1]``
2538
2539 Using the provided integer address, STORE writes data
2540 to the specified buffer or texture.
2541
2542 The 'address' is specified as a vector of unsigned
2543 integers. If the 'address' is out of range the result
2544 is unspecified.
2545
2546 Only the first mipmap level of a resource can be
2547 written to using this instruction.
2548
2549 For 1D or 2D texture arrays, the array index is
2550 provided as an unsigned integer in address.y or
2551 address.z, respectively. address.yz are ignored for
2552 buffers and 1D textures. address.z is ignored for 1D
2553 texture arrays and 2D textures. address.w is always
2554 ignored.
2555
2556 .. opcode:: RESQ - Query information about a resource
2557
2558 Syntax: ``RESQ dst, resource``
2559
2560 Example: ``RESQ TEMP[0], BUFFER[0]``
2561
2562 Returns information about the buffer or image resource. For buffer
2563 resources, the size (in bytes) is returned in the x component. For
2564 image resources, .xyz will contain the width/height/layers of the
2565 image, while .w will contain the number of samples for multi-sampled
2566 images.
2567
2568 .. opcode:: FBFETCH - Load data from framebuffer
2569
2570 Syntax: ``FBFETCH dst, output``
2571
2572 Example: ``FBFETCH TEMP[0], OUT[0]``
2573
2574 This is only valid on ``COLOR`` semantic outputs. Returns the color
2575 of the current position in the framebuffer from before this fragment
2576 shader invocation. May return the same value from multiple calls for
2577 a particular output within a single invocation. Note that result may
2578 be undefined if a fragment is drawn multiple times without a blend
2579 barrier in between.
2580
2581
2582 .. _threadsyncopcodes:
2583
2584 Inter-thread synchronization opcodes
2585 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
2586
2587 These opcodes are intended for communication between threads running
2588 within the same compute grid. For now they're only valid in compute
2589 programs.
2590
2591 .. opcode:: BARRIER - Thread group barrier
2592
2593 ``BARRIER``
2594
2595 This opcode suspends the execution of the current thread until all
2596 the remaining threads in the working group reach the same point of
2597 the program. Results are unspecified if any of the remaining
2598 threads terminates or never reaches an executed BARRIER instruction.
2599
2600 .. opcode:: MEMBAR - Memory barrier
2601
2602 ``MEMBAR type``
2603
2604 This opcode waits for the completion of all memory accesses based on
2605 the type passed in. The type is an immediate bitfield with the following
2606 meaning:
2607
2608 Bit 0: Shader storage buffers
2609 Bit 1: Atomic buffers
2610 Bit 2: Images
2611 Bit 3: Shared memory
2612 Bit 4: Thread group
2613
2614 These may be passed in in any combination. An implementation is free to not
2615 distinguish between these as it sees fit. However these map to all the
2616 possibilities made available by GLSL.
2617
2618 .. _atomopcodes:
2619
2620 Atomic opcodes
2621 ^^^^^^^^^^^^^^
2622
2623 These opcodes provide atomic variants of some common arithmetic and
2624 logical operations. In this context atomicity means that another
2625 concurrent memory access operation that affects the same memory
2626 location is guaranteed to be performed strictly before or after the
2627 entire execution of the atomic operation. The resource may be a BUFFER,
2628 IMAGE, or MEMORY. In the case of an image, the offset works the same as for
2629 ``LOAD`` and ``STORE``, specified above. These atomic operations may
2630 only be used with 32-bit integer image formats.
2631
2632 .. opcode:: ATOMUADD - Atomic integer addition
2633
2634 Syntax: ``ATOMUADD dst, resource, offset, src``
2635
2636 Example: ``ATOMUADD TEMP[0], BUFFER[0], TEMP[1], TEMP[2]``
2637
2638 The following operation is performed atomically:
2639
2640 .. math::
2641
2642 dst_x = resource[offset]
2643
2644 resource[offset] = dst_x + src_x
2645
2646
2647 .. opcode:: ATOMXCHG - Atomic exchange
2648
2649 Syntax: ``ATOMXCHG dst, resource, offset, src``
2650
2651 Example: ``ATOMXCHG TEMP[0], BUFFER[0], TEMP[1], TEMP[2]``
2652
2653 The following operation is performed atomically:
2654
2655 .. math::
2656
2657 dst_x = resource[offset]
2658
2659 resource[offset] = src_x
2660
2661
2662 .. opcode:: ATOMCAS - Atomic compare-and-exchange
2663
2664 Syntax: ``ATOMCAS dst, resource, offset, cmp, src``
2665
2666 Example: ``ATOMCAS TEMP[0], BUFFER[0], TEMP[1], TEMP[2], TEMP[3]``
2667
2668 The following operation is performed atomically:
2669
2670 .. math::
2671
2672 dst_x = resource[offset]
2673
2674 resource[offset] = (dst_x == cmp_x ? src_x : dst_x)
2675
2676
2677 .. opcode:: ATOMAND - Atomic bitwise And
2678
2679 Syntax: ``ATOMAND dst, resource, offset, src``
2680
2681 Example: ``ATOMAND TEMP[0], BUFFER[0], TEMP[1], TEMP[2]``
2682
2683 The following operation is performed atomically:
2684
2685 .. math::
2686
2687 dst_x = resource[offset]
2688
2689 resource[offset] = dst_x \& src_x
2690
2691
2692 .. opcode:: ATOMOR - Atomic bitwise Or
2693
2694 Syntax: ``ATOMOR dst, resource, offset, src``
2695
2696 Example: ``ATOMOR TEMP[0], BUFFER[0], TEMP[1], TEMP[2]``
2697
2698 The following operation is performed atomically:
2699
2700 .. math::
2701
2702 dst_x = resource[offset]
2703
2704 resource[offset] = dst_x | src_x
2705
2706
2707 .. opcode:: ATOMXOR - Atomic bitwise Xor
2708
2709 Syntax: ``ATOMXOR dst, resource, offset, src``
2710
2711 Example: ``ATOMXOR TEMP[0], BUFFER[0], TEMP[1], TEMP[2]``
2712
2713 The following operation is performed atomically:
2714
2715 .. math::
2716
2717 dst_x = resource[offset]
2718
2719 resource[offset] = dst_x \oplus src_x
2720
2721
2722 .. opcode:: ATOMUMIN - Atomic unsigned minimum
2723
2724 Syntax: ``ATOMUMIN dst, resource, offset, src``
2725
2726 Example: ``ATOMUMIN TEMP[0], BUFFER[0], TEMP[1], TEMP[2]``
2727
2728 The following operation is performed atomically:
2729
2730 .. math::
2731
2732 dst_x = resource[offset]
2733
2734 resource[offset] = (dst_x < src_x ? dst_x : src_x)
2735
2736
2737 .. opcode:: ATOMUMAX - Atomic unsigned maximum
2738
2739 Syntax: ``ATOMUMAX dst, resource, offset, src``
2740
2741 Example: ``ATOMUMAX TEMP[0], BUFFER[0], TEMP[1], TEMP[2]``
2742
2743 The following operation is performed atomically:
2744
2745 .. math::
2746
2747 dst_x = resource[offset]
2748
2749 resource[offset] = (dst_x > src_x ? dst_x : src_x)
2750
2751
2752 .. opcode:: ATOMIMIN - Atomic signed minimum
2753
2754 Syntax: ``ATOMIMIN dst, resource, offset, src``
2755
2756 Example: ``ATOMIMIN TEMP[0], BUFFER[0], TEMP[1], TEMP[2]``
2757
2758 The following operation is performed atomically:
2759
2760 .. math::
2761
2762 dst_x = resource[offset]
2763
2764 resource[offset] = (dst_x < src_x ? dst_x : src_x)
2765
2766
2767 .. opcode:: ATOMIMAX - Atomic signed maximum
2768
2769 Syntax: ``ATOMIMAX dst, resource, offset, src``
2770
2771 Example: ``ATOMIMAX TEMP[0], BUFFER[0], TEMP[1], TEMP[2]``
2772
2773 The following operation is performed atomically:
2774
2775 .. math::
2776
2777 dst_x = resource[offset]
2778
2779 resource[offset] = (dst_x > src_x ? dst_x : src_x)
2780
2781
2782 .. _interlaneopcodes:
2783
2784 Inter-lane opcodes
2785 ^^^^^^^^^^^^^^^^^^
2786
2787 These opcodes reduce the given value across the shader invocations
2788 running in the current SIMD group. Every thread in the subgroup will receive
2789 the same result. The BALLOT operations accept a single-channel argument that
2790 is treated as a boolean and produce a 64-bit value.
2791
2792 .. opcode:: VOTE_ANY - Value is set in any of the active invocations
2793
2794 Syntax: ``VOTE_ANY dst, value``
2795
2796 Example: ``VOTE_ANY TEMP[0].x, TEMP[1].x``
2797
2798
2799 .. opcode:: VOTE_ALL - Value is set in all of the active invocations
2800
2801 Syntax: ``VOTE_ALL dst, value``
2802
2803 Example: ``VOTE_ALL TEMP[0].x, TEMP[1].x``
2804
2805
2806 .. opcode:: VOTE_EQ - Value is the same in all of the active invocations
2807
2808 Syntax: ``VOTE_EQ dst, value``
2809
2810 Example: ``VOTE_EQ TEMP[0].x, TEMP[1].x``
2811
2812
2813 .. opcode:: BALLOT - Lanemask of whether the value is set in each active
2814 invocation
2815
2816 Syntax: ``BALLOT dst, value``
2817
2818 Example: ``BALLOT TEMP[0].xy, TEMP[1].x``
2819
2820 When the argument is a constant true, this produces a bitmask of active
2821 invocations. In fragment shaders, this can include helper invocations
2822 (invocations whose outputs and writes to memory are discarded, but which
2823 are used to compute derivatives).
2824
2825
2826 .. opcode:: READ_FIRST - Broadcast the value from the first active
2827 invocation to all active lanes
2828
2829 Syntax: ``READ_FIRST dst, value``
2830
2831 Example: ``READ_FIRST TEMP[0], TEMP[1]``
2832
2833
2834 .. opcode:: READ_INVOC - Retrieve the value from the given invocation
2835 (need not be uniform)
2836
2837 Syntax: ``READ_INVOC dst, value, invocation``
2838
2839 Example: ``READ_INVOC TEMP[0].xy, TEMP[1].xy, TEMP[2].x``
2840
2841 invocation.x controls the invocation number to read from for all channels.
2842 The invocation number must be the same across all active invocations in a
2843 sub-group; otherwise, the results are undefined.
2844
2845
2846 Explanation of symbols used
2847 ------------------------------
2848
2849
2850 Functions
2851 ^^^^^^^^^^^^^^
2852
2853
2854 :math:`|x|` Absolute value of `x`.
2855
2856 :math:`\lceil x \rceil` Ceiling of `x`.
2857
2858 clamp(x,y,z) Clamp x between y and z.
2859 (x < y) ? y : (x > z) ? z : x
2860
2861 :math:`\lfloor x\rfloor` Floor of `x`.
2862
2863 :math:`\log_2{x}` Logarithm of `x`, base 2.
2864
2865 max(x,y) Maximum of x and y.
2866 (x > y) ? x : y
2867
2868 min(x,y) Minimum of x and y.
2869 (x < y) ? x : y
2870
2871 partialx(x) Derivative of x relative to fragment's X.
2872
2873 partialy(x) Derivative of x relative to fragment's Y.
2874
2875 pop() Pop from stack.
2876
2877 :math:`x^y` `x` to the power `y`.
2878
2879 push(x) Push x on stack.
2880
2881 round(x) Round x.
2882
2883 trunc(x) Truncate x, i.e. drop the fraction bits.
2884
2885
2886 Keywords
2887 ^^^^^^^^^^^^^
2888
2889
2890 discard Discard fragment.
2891
2892 pc Program counter.
2893
2894 target Label of target instruction.
2895
2896
2897 Other tokens
2898 ---------------
2899
2900
2901 Declaration
2902 ^^^^^^^^^^^
2903
2904
2905 Declares a register that is will be referenced as an operand in Instruction
2906 tokens.
2907
2908 File field contains register file that is being declared and is one
2909 of TGSI_FILE.
2910
2911 UsageMask field specifies which of the register components can be accessed
2912 and is one of TGSI_WRITEMASK.
2913
2914 The Local flag specifies that a given value isn't intended for
2915 subroutine parameter passing and, as a result, the implementation
2916 isn't required to give any guarantees of it being preserved across
2917 subroutine boundaries. As it's merely a compiler hint, the
2918 implementation is free to ignore it.
2919
2920 If Dimension flag is set to 1, a Declaration Dimension token follows.
2921
2922 If Semantic flag is set to 1, a Declaration Semantic token follows.
2923
2924 If Interpolate flag is set to 1, a Declaration Interpolate token follows.
2925
2926 If file is TGSI_FILE_RESOURCE, a Declaration Resource token follows.
2927
2928 If Array flag is set to 1, a Declaration Array token follows.
2929
2930 Array Declaration
2931 ^^^^^^^^^^^^^^^^^^^^^^^^
2932
2933 Declarations can optional have an ArrayID attribute which can be referred by
2934 indirect addressing operands. An ArrayID of zero is reserved and treated as
2935 if no ArrayID is specified.
2936
2937 If an indirect addressing operand refers to a specific declaration by using
2938 an ArrayID only the registers in this declaration are guaranteed to be
2939 accessed, accessing any register outside this declaration results in undefined
2940 behavior. Note that for compatibility the effective index is zero-based and
2941 not relative to the specified declaration
2942
2943 If no ArrayID is specified with an indirect addressing operand the whole
2944 register file might be accessed by this operand. This is strongly discouraged
2945 and will prevent packing of scalar/vec2 arrays and effective alias analysis.
2946 This is only legal for TEMP and CONST register files.
2947
2948 Declaration Semantic
2949 ^^^^^^^^^^^^^^^^^^^^^^^^
2950
2951 Vertex and fragment shader input and output registers may be labeled
2952 with semantic information consisting of a name and index.
2953
2954 Follows Declaration token if Semantic bit is set.
2955
2956 Since its purpose is to link a shader with other stages of the pipeline,
2957 it is valid to follow only those Declaration tokens that declare a register
2958 either in INPUT or OUTPUT file.
2959
2960 SemanticName field contains the semantic name of the register being declared.
2961 There is no default value.
2962
2963 SemanticIndex is an optional subscript that can be used to distinguish
2964 different register declarations with the same semantic name. The default value
2965 is 0.
2966
2967 The meanings of the individual semantic names are explained in the following
2968 sections.
2969
2970 TGSI_SEMANTIC_POSITION
2971 """"""""""""""""""""""
2972
2973 For vertex shaders, TGSI_SEMANTIC_POSITION indicates the vertex shader
2974 output register which contains the homogeneous vertex position in the clip
2975 space coordinate system. After clipping, the X, Y and Z components of the
2976 vertex will be divided by the W value to get normalized device coordinates.
2977
2978 For fragment shaders, TGSI_SEMANTIC_POSITION is used to indicate that
2979 fragment shader input (or system value, depending on which one is
2980 supported by the driver) contains the fragment's window position. The X
2981 component starts at zero and always increases from left to right.
2982 The Y component starts at zero and always increases but Y=0 may either
2983 indicate the top of the window or the bottom depending on the fragment
2984 coordinate origin convention (see TGSI_PROPERTY_FS_COORD_ORIGIN).
2985 The Z coordinate ranges from 0 to 1 to represent depth from the front
2986 to the back of the Z buffer. The W component contains the interpolated
2987 reciprocal of the vertex position W component (corresponding to gl_Fragcoord,
2988 but unlike d3d10 which interpolates the same 1/w but then gives back
2989 the reciprocal of the interpolated value).
2990
2991 Fragment shaders may also declare an output register with
2992 TGSI_SEMANTIC_POSITION. Only the Z component is writable. This allows
2993 the fragment shader to change the fragment's Z position.
2994
2995
2996
2997 TGSI_SEMANTIC_COLOR
2998 """""""""""""""""""
2999
3000 For vertex shader outputs or fragment shader inputs/outputs, this
3001 label indicates that the register contains an R,G,B,A color.
3002
3003 Several shader inputs/outputs may contain colors so the semantic index
3004 is used to distinguish them. For example, color[0] may be the diffuse
3005 color while color[1] may be the specular color.
3006
3007 This label is needed so that the flat/smooth shading can be applied
3008 to the right interpolants during rasterization.
3009
3010
3011
3012 TGSI_SEMANTIC_BCOLOR
3013 """"""""""""""""""""
3014
3015 Back-facing colors are only used for back-facing polygons, and are only valid
3016 in vertex shader outputs. After rasterization, all polygons are front-facing
3017 and COLOR and BCOLOR end up occupying the same slots in the fragment shader,
3018 so all BCOLORs effectively become regular COLORs in the fragment shader.
3019
3020
3021 TGSI_SEMANTIC_FOG
3022 """""""""""""""""
3023
3024 Vertex shader inputs and outputs and fragment shader inputs may be
3025 labeled with TGSI_SEMANTIC_FOG to indicate that the register contains
3026 a fog coordinate. Typically, the fragment shader will use the fog coordinate
3027 to compute a fog blend factor which is used to blend the normal fragment color
3028 with a constant fog color. But fog coord really is just an ordinary vec4
3029 register like regular semantics.
3030
3031
3032 TGSI_SEMANTIC_PSIZE
3033 """""""""""""""""""
3034
3035 Vertex shader input and output registers may be labeled with
3036 TGIS_SEMANTIC_PSIZE to indicate that the register contains a point size
3037 in the form (S, 0, 0, 1). The point size controls the width or diameter
3038 of points for rasterization. This label cannot be used in fragment
3039 shaders.
3040
3041 When using this semantic, be sure to set the appropriate state in the
3042 :ref:`rasterizer` first.
3043
3044
3045 TGSI_SEMANTIC_TEXCOORD
3046 """"""""""""""""""""""
3047
3048 Only available if PIPE_CAP_TGSI_TEXCOORD is exposed !
3049
3050 Vertex shader outputs and fragment shader inputs may be labeled with
3051 this semantic to make them replaceable by sprite coordinates via the
3052 sprite_coord_enable state in the :ref:`rasterizer`.
3053 The semantic index permitted with this semantic is limited to <= 7.
3054
3055 If the driver does not support TEXCOORD, sprite coordinate replacement
3056 applies to inputs with the GENERIC semantic instead.
3057
3058 The intended use case for this semantic is gl_TexCoord.
3059
3060
3061 TGSI_SEMANTIC_PCOORD
3062 """"""""""""""""""""
3063
3064 Only available if PIPE_CAP_TGSI_TEXCOORD is exposed !
3065
3066 Fragment shader inputs may be labeled with TGSI_SEMANTIC_PCOORD to indicate
3067 that the register contains sprite coordinates in the form (x, y, 0, 1), if
3068 the current primitive is a point and point sprites are enabled. Otherwise,
3069 the contents of the register are undefined.
3070
3071 The intended use case for this semantic is gl_PointCoord.
3072
3073
3074 TGSI_SEMANTIC_GENERIC
3075 """""""""""""""""""""
3076
3077 All vertex/fragment shader inputs/outputs not labeled with any other
3078 semantic label can be considered to be generic attributes. Typical
3079 uses of generic inputs/outputs are texcoords and user-defined values.
3080
3081
3082 TGSI_SEMANTIC_NORMAL
3083 """"""""""""""""""""
3084
3085 Indicates that a vertex shader input is a normal vector. This is
3086 typically only used for legacy graphics APIs.
3087
3088
3089 TGSI_SEMANTIC_FACE
3090 """"""""""""""""""
3091
3092 This label applies to fragment shader inputs (or system values,
3093 depending on which one is supported by the driver) and indicates that
3094 the register contains front/back-face information.
3095
3096 If it is an input, it will be a floating-point vector in the form (F, 0, 0, 1),
3097 where F will be positive when the fragment belongs to a front-facing polygon,
3098 and negative when the fragment belongs to a back-facing polygon.
3099
3100 If it is a system value, it will be an integer vector in the form (F, 0, 0, 1),
3101 where F is 0xffffffff when the fragment belongs to a front-facing polygon and
3102 0 when the fragment belongs to a back-facing polygon.
3103
3104
3105 TGSI_SEMANTIC_EDGEFLAG
3106 """"""""""""""""""""""
3107
3108 For vertex shaders, this sematic label indicates that an input or
3109 output is a boolean edge flag. The register layout is [F, x, x, x]
3110 where F is 0.0 or 1.0 and x = don't care. Normally, the vertex shader
3111 simply copies the edge flag input to the edgeflag output.
3112
3113 Edge flags are used to control which lines or points are actually
3114 drawn when the polygon mode converts triangles/quads/polygons into
3115 points or lines.
3116
3117
3118 TGSI_SEMANTIC_STENCIL
3119 """""""""""""""""""""
3120
3121 For fragment shaders, this semantic label indicates that an output
3122 is a writable stencil reference value. Only the Y component is writable.
3123 This allows the fragment shader to change the fragments stencilref value.
3124
3125
3126 TGSI_SEMANTIC_VIEWPORT_INDEX
3127 """"""""""""""""""""""""""""
3128
3129 For geometry shaders, this semantic label indicates that an output
3130 contains the index of the viewport (and scissor) to use.
3131 This is an integer value, and only the X component is used.
3132
3133 If PIPE_CAP_TGSI_VS_LAYER_VIEWPORT or PIPE_CAP_TGSI_TES_LAYER_VIEWPORT is
3134 supported, then this semantic label can also be used in vertex or
3135 tessellation evaluation shaders, respectively. Only the value written in the
3136 last vertex processing stage is used.
3137
3138
3139 TGSI_SEMANTIC_LAYER
3140 """""""""""""""""""
3141
3142 For geometry shaders, this semantic label indicates that an output
3143 contains the layer value to use for the color and depth/stencil surfaces.
3144 This is an integer value, and only the X component is used.
3145 (Also known as rendertarget array index.)
3146
3147 If PIPE_CAP_TGSI_VS_LAYER_VIEWPORT or PIPE_CAP_TGSI_TES_LAYER_VIEWPORT is
3148 supported, then this semantic label can also be used in vertex or
3149 tessellation evaluation shaders, respectively. Only the value written in the
3150 last vertex processing stage is used.
3151
3152
3153 TGSI_SEMANTIC_CULLDIST
3154 """"""""""""""""""""""
3155
3156 Used as distance to plane for performing application-defined culling
3157 of individual primitives against a plane. When components of vertex
3158 elements are given this label, these values are assumed to be a
3159 float32 signed distance to a plane. Primitives will be completely
3160 discarded if the plane distance for all of the vertices in the
3161 primitive are < 0. If a vertex has a cull distance of NaN, that
3162 vertex counts as "out" (as if its < 0);
3163 The limits on both clip and cull distances are bound
3164 by the PIPE_MAX_CLIP_OR_CULL_DISTANCE_COUNT define which defines
3165 the maximum number of components that can be used to hold the
3166 distances and by the PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT
3167 which specifies the maximum number of registers which can be
3168 annotated with those semantics.
3169
3170
3171 TGSI_SEMANTIC_CLIPDIST
3172 """"""""""""""""""""""
3173
3174 Note this covers clipping and culling distances.
3175
3176 When components of vertex elements are identified this way, these
3177 values are each assumed to be a float32 signed distance to a plane.
3178
3179 For clip distances:
3180 Primitive setup only invokes rasterization on pixels for which
3181 the interpolated plane distances are >= 0.
3182
3183 For cull distances:
3184 Primitives will be completely discarded if the plane distance
3185 for all of the vertices in the primitive are < 0.
3186 If a vertex has a cull distance of NaN, that vertex counts as "out"
3187 (as if its < 0);
3188
3189 Multiple clip/cull planes can be implemented simultaneously, by
3190 annotating multiple components of one or more vertex elements with
3191 the above specified semantic.
3192 The limits on both clip and cull distances are bound
3193 by the PIPE_MAX_CLIP_OR_CULL_DISTANCE_COUNT define which defines
3194 the maximum number of components that can be used to hold the
3195 distances and by the PIPE_MAX_CLIP_OR_CULL_DISTANCE_ELEMENT_COUNT
3196 which specifies the maximum number of registers which can be
3197 annotated with those semantics.
3198 The properties NUM_CLIPDIST_ENABLED and NUM_CULLDIST_ENABLED
3199 are used to divide up the 2 x vec4 space between clipping and culling.
3200
3201 TGSI_SEMANTIC_SAMPLEID
3202 """"""""""""""""""""""
3203
3204 For fragment shaders, this semantic label indicates that a system value
3205 contains the current sample id (i.e. gl_SampleID) as an unsigned int.
3206 Only the X component is used. If per-sample shading is not enabled,
3207 the result is (0, undef, undef, undef).
3208
3209 Note that if the fragment shader uses this system value, the fragment
3210 shader is automatically executed at per sample frequency.
3211
3212 TGSI_SEMANTIC_SAMPLEPOS
3213 """""""""""""""""""""""
3214
3215 For fragment shaders, this semantic label indicates that a system
3216 value contains the current sample's position as float4(x, y, undef, undef)
3217 in the render target (i.e. gl_SamplePosition) when per-fragment shading
3218 is in effect. Position values are in the range [0, 1] where 0.5 is
3219 the center of the fragment.
3220
3221 Note that if the fragment shader uses this system value, the fragment
3222 shader is automatically executed at per sample frequency.
3223
3224 TGSI_SEMANTIC_SAMPLEMASK
3225 """"""""""""""""""""""""
3226
3227 For fragment shaders, this semantic label can be applied to either a
3228 shader system value input or output.
3229
3230 For a system value, the sample mask indicates the set of samples covered by
3231 the current primitive. If MSAA is not enabled, the value is (1, 0, 0, 0).
3232
3233 For an output, the sample mask is used to disable further sample processing.
3234
3235 For both, the register type is uint[4] but only the X component is used
3236 (i.e. gl_SampleMask[0]). Each bit corresponds to one sample position (up
3237 to 32x MSAA is supported).
3238
3239 TGSI_SEMANTIC_INVOCATIONID
3240 """"""""""""""""""""""""""
3241
3242 For geometry shaders, this semantic label indicates that a system value
3243 contains the current invocation id (i.e. gl_InvocationID).
3244 This is an integer value, and only the X component is used.
3245
3246 TGSI_SEMANTIC_INSTANCEID
3247 """"""""""""""""""""""""
3248
3249 For vertex shaders, this semantic label indicates that a system value contains
3250 the current instance id (i.e. gl_InstanceID). It does not include the base
3251 instance. This is an integer value, and only the X component is used.
3252
3253 TGSI_SEMANTIC_VERTEXID
3254 """"""""""""""""""""""
3255
3256 For vertex shaders, this semantic label indicates that a system value contains
3257 the current vertex id (i.e. gl_VertexID). It does (unlike in d3d10) include the
3258 base vertex. This is an integer value, and only the X component is used.
3259
3260 TGSI_SEMANTIC_VERTEXID_NOBASE
3261 """""""""""""""""""""""""""""""
3262
3263 For vertex shaders, this semantic label indicates that a system value contains
3264 the current vertex id without including the base vertex (this corresponds to
3265 d3d10 vertex id, so TGSI_SEMANTIC_VERTEXID_NOBASE + TGSI_SEMANTIC_BASEVERTEX
3266 == TGSI_SEMANTIC_VERTEXID). This is an integer value, and only the X component
3267 is used.
3268
3269 TGSI_SEMANTIC_BASEVERTEX
3270 """"""""""""""""""""""""
3271
3272 For vertex shaders, this semantic label indicates that a system value contains
3273 the base vertex (i.e. gl_BaseVertex). Note that for non-indexed draw calls,
3274 this contains the first (or start) value instead.
3275 This is an integer value, and only the X component is used.
3276
3277 TGSI_SEMANTIC_PRIMID
3278 """"""""""""""""""""
3279
3280 For geometry and fragment shaders, this semantic label indicates the value
3281 contains the primitive id (i.e. gl_PrimitiveID). This is an integer value,
3282 and only the X component is used.
3283 FIXME: This right now can be either a ordinary input or a system value...
3284
3285
3286 TGSI_SEMANTIC_PATCH
3287 """""""""""""""""""
3288
3289 For tessellation evaluation/control shaders, this semantic label indicates a
3290 generic per-patch attribute. Such semantics will not implicitly be per-vertex
3291 arrays.
3292
3293 TGSI_SEMANTIC_TESSCOORD
3294 """""""""""""""""""""""
3295
3296 For tessellation evaluation shaders, this semantic label indicates the
3297 coordinates of the vertex being processed. This is available in XYZ; W is
3298 undefined.
3299
3300 TGSI_SEMANTIC_TESSOUTER
3301 """""""""""""""""""""""
3302
3303 For tessellation evaluation/control shaders, this semantic label indicates the
3304 outer tessellation levels of the patch. Isoline tessellation will only have XY
3305 defined, triangle will have XYZ and quads will have XYZW defined. This
3306 corresponds to gl_TessLevelOuter.
3307
3308 TGSI_SEMANTIC_TESSINNER
3309 """""""""""""""""""""""
3310
3311 For tessellation evaluation/control shaders, this semantic label indicates the
3312 inner tessellation levels of the patch. The X value is only defined for
3313 triangle tessellation, while quads will have XY defined. This is entirely
3314 undefined for isoline tessellation.
3315
3316 TGSI_SEMANTIC_VERTICESIN
3317 """"""""""""""""""""""""
3318
3319 For tessellation evaluation/control shaders, this semantic label indicates the
3320 number of vertices provided in the input patch. Only the X value is defined.
3321
3322 TGSI_SEMANTIC_HELPER_INVOCATION
3323 """""""""""""""""""""""""""""""
3324
3325 For fragment shaders, this semantic indicates whether the current
3326 invocation is covered or not. Helper invocations are created in order
3327 to properly compute derivatives, however it may be desirable to skip
3328 some of the logic in those cases. See ``gl_HelperInvocation`` documentation.
3329
3330 TGSI_SEMANTIC_BASEINSTANCE
3331 """"""""""""""""""""""""""
3332
3333 For vertex shaders, the base instance argument supplied for this
3334 draw. This is an integer value, and only the X component is used.
3335
3336 TGSI_SEMANTIC_DRAWID
3337 """"""""""""""""""""
3338
3339 For vertex shaders, the zero-based index of the current draw in a
3340 ``glMultiDraw*`` invocation. This is an integer value, and only the X
3341 component is used.
3342
3343
3344 TGSI_SEMANTIC_WORK_DIM
3345 """"""""""""""""""""""
3346
3347 For compute shaders started via opencl this retrieves the work_dim
3348 parameter to the clEnqueueNDRangeKernel call with which the shader
3349 was started.
3350
3351
3352 TGSI_SEMANTIC_GRID_SIZE
3353 """""""""""""""""""""""
3354
3355 For compute shaders, this semantic indicates the maximum (x, y, z) dimensions
3356 of a grid of thread blocks.
3357
3358
3359 TGSI_SEMANTIC_BLOCK_ID
3360 """"""""""""""""""""""
3361
3362 For compute shaders, this semantic indicates the (x, y, z) coordinates of the
3363 current block inside of the grid.
3364
3365
3366 TGSI_SEMANTIC_BLOCK_SIZE
3367 """"""""""""""""""""""""
3368
3369 For compute shaders, this semantic indicates the maximum (x, y, z) dimensions
3370 of a block in threads.
3371
3372
3373 TGSI_SEMANTIC_THREAD_ID
3374 """""""""""""""""""""""
3375
3376 For compute shaders, this semantic indicates the (x, y, z) coordinates of the
3377 current thread inside of the block.
3378
3379
3380 TGSI_SEMANTIC_SUBGROUP_SIZE
3381 """""""""""""""""""""""""""
3382
3383 This semantic indicates the subgroup size for the current invocation. This is
3384 an integer of at most 64, as it indicates the width of lanemasks. It does not
3385 depend on the number of invocations that are active.
3386
3387
3388 TGSI_SEMANTIC_SUBGROUP_INVOCATION
3389 """""""""""""""""""""""""""""""""
3390
3391 The index of the current invocation within its subgroup.
3392
3393
3394 TGSI_SEMANTIC_SUBGROUP_EQ_MASK
3395 """"""""""""""""""""""""""""""
3396
3397 A bit mask of ``bit index == TGSI_SEMANTIC_SUBGROUP_INVOCATION``, i.e.
3398 ``1 << subgroup_invocation`` in arbitrary precision arithmetic.
3399
3400
3401 TGSI_SEMANTIC_SUBGROUP_GE_MASK
3402 """"""""""""""""""""""""""""""
3403
3404 A bit mask of ``bit index >= TGSI_SEMANTIC_SUBGROUP_INVOCATION``, i.e.
3405 ``((1 << (subgroup_size - subgroup_invocation)) - 1) << subgroup_invocation``
3406 in arbitrary precision arithmetic.
3407
3408
3409 TGSI_SEMANTIC_SUBGROUP_GT_MASK
3410 """"""""""""""""""""""""""""""
3411
3412 A bit mask of ``bit index > TGSI_SEMANTIC_SUBGROUP_INVOCATION``, i.e.
3413 ``((1 << (subgroup_size - subgroup_invocation - 1)) - 1) << (subgroup_invocation + 1)``
3414 in arbitrary precision arithmetic.
3415
3416
3417 TGSI_SEMANTIC_SUBGROUP_LE_MASK
3418 """"""""""""""""""""""""""""""
3419
3420 A bit mask of ``bit index <= TGSI_SEMANTIC_SUBGROUP_INVOCATION``, i.e.
3421 ``(1 << (subgroup_invocation + 1)) - 1`` in arbitrary precision arithmetic.
3422
3423
3424 TGSI_SEMANTIC_SUBGROUP_LT_MASK
3425 """"""""""""""""""""""""""""""
3426
3427 A bit mask of ``bit index > TGSI_SEMANTIC_SUBGROUP_INVOCATION``, i.e.
3428 ``(1 << subgroup_invocation) - 1`` in arbitrary precision arithmetic.
3429
3430
3431 Declaration Interpolate
3432 ^^^^^^^^^^^^^^^^^^^^^^^
3433
3434 This token is only valid for fragment shader INPUT declarations.
3435
3436 The Interpolate field specifes the way input is being interpolated by
3437 the rasteriser and is one of TGSI_INTERPOLATE_*.
3438
3439 The Location field specifies the location inside the pixel that the
3440 interpolation should be done at, one of ``TGSI_INTERPOLATE_LOC_*``. Note that
3441 when per-sample shading is enabled, the implementation may choose to
3442 interpolate at the sample irrespective of the Location field.
3443
3444 The CylindricalWrap bitfield specifies which register components
3445 should be subject to cylindrical wrapping when interpolating by the
3446 rasteriser. If TGSI_CYLINDRICAL_WRAP_X is set to 1, the X component
3447 should be interpolated according to cylindrical wrapping rules.
3448
3449
3450 Declaration Sampler View
3451 ^^^^^^^^^^^^^^^^^^^^^^^^
3452
3453 Follows Declaration token if file is TGSI_FILE_SAMPLER_VIEW.
3454
3455 DCL SVIEW[#], resource, type(s)
3456
3457 Declares a shader input sampler view and assigns it to a SVIEW[#]
3458 register.
3459
3460 resource can be one of BUFFER, 1D, 2D, 3D, 1DArray and 2DArray.
3461
3462 type must be 1 or 4 entries (if specifying on a per-component
3463 level) out of UNORM, SNORM, SINT, UINT and FLOAT.
3464
3465 For TEX\* style texture sample opcodes (as opposed to SAMPLE\* opcodes
3466 which take an explicit SVIEW[#] source register), there may be optionally
3467 SVIEW[#] declarations. In this case, the SVIEW index is implied by the
3468 SAMP index, and there must be a corresponding SVIEW[#] declaration for
3469 each SAMP[#] declaration. Drivers are free to ignore this if they wish.
3470 But note in particular that some drivers need to know the sampler type
3471 (float/int/unsigned) in order to generate the correct code, so cases
3472 where integer textures are sampled, SVIEW[#] declarations should be
3473 used.
3474
3475 NOTE: It is NOT legal to mix SAMPLE\* style opcodes and TEX\* opcodes
3476 in the same shader.
3477
3478 Declaration Resource
3479 ^^^^^^^^^^^^^^^^^^^^
3480
3481 Follows Declaration token if file is TGSI_FILE_RESOURCE.
3482
3483 DCL RES[#], resource [, WR] [, RAW]
3484
3485 Declares a shader input resource and assigns it to a RES[#]
3486 register.
3487
3488 resource can be one of BUFFER, 1D, 2D, 3D, CUBE, 1DArray and
3489 2DArray.
3490
3491 If the RAW keyword is not specified, the texture data will be
3492 subject to conversion, swizzling and scaling as required to yield
3493 the specified data type from the physical data format of the bound
3494 resource.
3495
3496 If the RAW keyword is specified, no channel conversion will be
3497 performed: the values read for each of the channels (X,Y,Z,W) will
3498 correspond to consecutive words in the same order and format
3499 they're found in memory. No element-to-address conversion will be
3500 performed either: the value of the provided X coordinate will be
3501 interpreted in byte units instead of texel units. The result of
3502 accessing a misaligned address is undefined.
3503
3504 Usage of the STORE opcode is only allowed if the WR (writable) flag
3505 is set.
3506
3507
3508 Properties
3509 ^^^^^^^^^^^^^^^^^^^^^^^^
3510
3511 Properties are general directives that apply to the whole TGSI program.
3512
3513 FS_COORD_ORIGIN
3514 """""""""""""""
3515
3516 Specifies the fragment shader TGSI_SEMANTIC_POSITION coordinate origin.
3517 The default value is UPPER_LEFT.
3518
3519 If UPPER_LEFT, the position will be (0,0) at the upper left corner and
3520 increase downward and rightward.
3521 If LOWER_LEFT, the position will be (0,0) at the lower left corner and
3522 increase upward and rightward.
3523
3524 OpenGL defaults to LOWER_LEFT, and is configurable with the
3525 GL_ARB_fragment_coord_conventions extension.
3526
3527 DirectX 9/10 use UPPER_LEFT.
3528
3529 FS_COORD_PIXEL_CENTER
3530 """""""""""""""""""""
3531
3532 Specifies the fragment shader TGSI_SEMANTIC_POSITION pixel center convention.
3533 The default value is HALF_INTEGER.
3534
3535 If HALF_INTEGER, the fractionary part of the position will be 0.5
3536 If INTEGER, the fractionary part of the position will be 0.0
3537
3538 Note that this does not affect the set of fragments generated by
3539 rasterization, which is instead controlled by half_pixel_center in the
3540 rasterizer.
3541
3542 OpenGL defaults to HALF_INTEGER, and is configurable with the
3543 GL_ARB_fragment_coord_conventions extension.
3544
3545 DirectX 9 uses INTEGER.
3546 DirectX 10 uses HALF_INTEGER.
3547
3548 FS_COLOR0_WRITES_ALL_CBUFS
3549 """"""""""""""""""""""""""
3550 Specifies that writes to the fragment shader color 0 are replicated to all
3551 bound cbufs. This facilitates OpenGL's fragColor output vs fragData[0] where
3552 fragData is directed to a single color buffer, but fragColor is broadcast.
3553
3554 VS_PROHIBIT_UCPS
3555 """"""""""""""""""""""""""
3556 If this property is set on the program bound to the shader stage before the
3557 fragment shader, user clip planes should have no effect (be disabled) even if
3558 that shader does not write to any clip distance outputs and the rasterizer's
3559 clip_plane_enable is non-zero.
3560 This property is only supported by drivers that also support shader clip
3561 distance outputs.
3562 This is useful for APIs that don't have UCPs and where clip distances written
3563 by a shader cannot be disabled.
3564
3565 GS_INVOCATIONS
3566 """"""""""""""
3567
3568 Specifies the number of times a geometry shader should be executed for each
3569 input primitive. Each invocation will have a different
3570 TGSI_SEMANTIC_INVOCATIONID system value set. If not specified, assumed to
3571 be 1.
3572
3573 VS_WINDOW_SPACE_POSITION
3574 """"""""""""""""""""""""""
3575 If this property is set on the vertex shader, the TGSI_SEMANTIC_POSITION output
3576 is assumed to contain window space coordinates.
3577 Division of X,Y,Z by W and the viewport transformation are disabled, and 1/W is
3578 directly taken from the 4-th component of the shader output.
3579 Naturally, clipping is not performed on window coordinates either.
3580 The effect of this property is undefined if a geometry or tessellation shader
3581 are in use.
3582
3583 TCS_VERTICES_OUT
3584 """"""""""""""""
3585
3586 The number of vertices written by the tessellation control shader. This
3587 effectively defines the patch input size of the tessellation evaluation shader
3588 as well.
3589
3590 TES_PRIM_MODE
3591 """""""""""""
3592
3593 This sets the tessellation primitive mode, one of ``PIPE_PRIM_TRIANGLES``,
3594 ``PIPE_PRIM_QUADS``, or ``PIPE_PRIM_LINES``. (Unlike in GL, there is no
3595 separate isolines settings, the regular lines is assumed to mean isolines.)
3596
3597 TES_SPACING
3598 """""""""""
3599
3600 This sets the spacing mode of the tessellation generator, one of
3601 ``PIPE_TESS_SPACING_*``.
3602
3603 TES_VERTEX_ORDER_CW
3604 """""""""""""""""""
3605
3606 This sets the vertex order to be clockwise if the value is 1, or
3607 counter-clockwise if set to 0.
3608
3609 TES_POINT_MODE
3610 """"""""""""""
3611
3612 If set to a non-zero value, this turns on point mode for the tessellator,
3613 which means that points will be generated instead of primitives.
3614
3615 NUM_CLIPDIST_ENABLED
3616 """"""""""""""""""""
3617
3618 How many clip distance scalar outputs are enabled.
3619
3620 NUM_CULLDIST_ENABLED
3621 """"""""""""""""""""
3622
3623 How many cull distance scalar outputs are enabled.
3624
3625 FS_EARLY_DEPTH_STENCIL
3626 """"""""""""""""""""""
3627
3628 Whether depth test, stencil test, and occlusion query should run before
3629 the fragment shader (regardless of fragment shader side effects). Corresponds
3630 to GLSL early_fragment_tests.
3631
3632 NEXT_SHADER
3633 """""""""""
3634
3635 Which shader stage will MOST LIKELY follow after this shader when the shader
3636 is bound. This is only a hint to the driver and doesn't have to be precise.
3637 Only set for VS and TES.
3638
3639 CS_FIXED_BLOCK_WIDTH / HEIGHT / DEPTH
3640 """""""""""""""""""""""""""""""""""""
3641
3642 Threads per block in each dimension, if known at compile time. If the block size
3643 is known all three should be at least 1. If it is unknown they should all be set
3644 to 0 or not set.
3645
3646 MUL_ZERO_WINS
3647 """""""""""""
3648
3649 The MUL TGSI operation (FP32 multiplication) will return 0 if either
3650 of the operands are equal to 0. That means that 0 * Inf = 0. This
3651 should be set the same way for an entire pipeline. Note that this
3652 applies not only to the literal MUL TGSI opcode, but all FP32
3653 multiplications implied by other operations, such as MAD, FMA, DP2,
3654 DP3, DP4, DST, LOG, LRP, and possibly others. If there is a
3655 mismatch between shaders, then it is unspecified whether this behavior
3656 will be enabled.
3657
3658 FS_POST_DEPTH_COVERAGE
3659 """"""""""""""""""""""
3660
3661 When enabled, the input for TGSI_SEMANTIC_SAMPLEMASK will exclude samples
3662 that have failed the depth/stencil tests. This is only valid when
3663 FS_EARLY_DEPTH_STENCIL is also specified.
3664
3665
3666 Texture Sampling and Texture Formats
3667 ------------------------------------
3668
3669 This table shows how texture image components are returned as (x,y,z,w) tuples
3670 by TGSI texture instructions, such as :opcode:`TEX`, :opcode:`TXD`, and
3671 :opcode:`TXP`. For reference, OpenGL and Direct3D conventions are shown as
3672 well.
3673
3674 +--------------------+--------------+--------------------+--------------+
3675 | Texture Components | Gallium | OpenGL | Direct3D 9 |
3676 +====================+==============+====================+==============+
3677 | R | (r, 0, 0, 1) | (r, 0, 0, 1) | (r, 1, 1, 1) |
3678 +--------------------+--------------+--------------------+--------------+
3679 | RG | (r, g, 0, 1) | (r, g, 0, 1) | (r, g, 1, 1) |
3680 +--------------------+--------------+--------------------+--------------+
3681 | RGB | (r, g, b, 1) | (r, g, b, 1) | (r, g, b, 1) |
3682 +--------------------+--------------+--------------------+--------------+
3683 | RGBA | (r, g, b, a) | (r, g, b, a) | (r, g, b, a) |
3684 +--------------------+--------------+--------------------+--------------+
3685 | A | (0, 0, 0, a) | (0, 0, 0, a) | (0, 0, 0, a) |
3686 +--------------------+--------------+--------------------+--------------+
3687 | L | (l, l, l, 1) | (l, l, l, 1) | (l, l, l, 1) |
3688 +--------------------+--------------+--------------------+--------------+
3689 | LA | (l, l, l, a) | (l, l, l, a) | (l, l, l, a) |
3690 +--------------------+--------------+--------------------+--------------+
3691 | I | (i, i, i, i) | (i, i, i, i) | N/A |
3692 +--------------------+--------------+--------------------+--------------+
3693 | UV | XXX TBD | (0, 0, 0, 1) | (u, v, 1, 1) |
3694 | | | [#envmap-bumpmap]_ | |
3695 +--------------------+--------------+--------------------+--------------+
3696 | Z | XXX TBD | (z, z, z, 1) | (0, z, 0, 1) |
3697 | | | [#depth-tex-mode]_ | |
3698 +--------------------+--------------+--------------------+--------------+
3699 | S | (s, s, s, s) | unknown | unknown |
3700 +--------------------+--------------+--------------------+--------------+
3701
3702 .. [#envmap-bumpmap] http://www.opengl.org/registry/specs/ATI/envmap_bumpmap.txt
3703 .. [#depth-tex-mode] the default is (z, z, z, 1) but may also be (0, 0, 0, z)
3704 or (z, z, z, z) depending on the value of GL_DEPTH_TEXTURE_MODE.