p_shader_tokens.h revision 434e255eae90b0f3d836d452b7d3b0c5aadf78b8
1/**************************************************************************
2 *
3 * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4 * All Rights Reserved.
5 *
6 * Permission is hereby granted, free of charge, to any person obtaining a
7 * copy of this software and associated documentation files (the
8 * "Software"), to deal in the Software without restriction, including
9 * without limitation the rights to use, copy, modify, merge, publish,
10 * distribute, sub license, and/or sell copies of the Software, and to
11 * permit persons to whom the Software is furnished to do so, subject to
12 * the following conditions:
13 *
14 * The above copyright notice and this permission notice (including the
15 * next paragraph) shall be included in all copies or substantial portions
16 * of the Software.
17 *
18 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21 * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
22 * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25 *
26 **************************************************************************/
27
28#ifndef TGSI_TOKEN_H
29#define TGSI_TOKEN_H
30
31#ifdef __cplusplus
32extern "C" {
33#endif
34
35#include "p_compiler.h"
36
37struct tgsi_version
38{
39   unsigned MajorVersion  : 8;
40   unsigned MinorVersion  : 8;
41   unsigned Padding       : 16;
42};
43
44struct tgsi_header
45{
46   unsigned HeaderSize : 8;
47   unsigned BodySize   : 24;
48};
49
50#define TGSI_PROCESSOR_FRAGMENT  0
51#define TGSI_PROCESSOR_VERTEX    1
52#define TGSI_PROCESSOR_GEOMETRY  2
53
54struct tgsi_processor
55{
56   unsigned Processor  : 4;  /* TGSI_PROCESSOR_ */
57   unsigned Padding    : 28;
58};
59
60#define TGSI_TOKEN_TYPE_DECLARATION    0
61#define TGSI_TOKEN_TYPE_IMMEDIATE      1
62#define TGSI_TOKEN_TYPE_INSTRUCTION    2
63
64struct tgsi_token
65{
66   unsigned Type       : 4;  /* TGSI_TOKEN_TYPE_ */
67   unsigned Size       : 8;  /* UINT */
68   unsigned Padding    : 19;
69   unsigned Extended   : 1;  /* BOOL */
70};
71
72enum tgsi_file_type {
73   TGSI_FILE_NULL        =0,
74   TGSI_FILE_CONSTANT    =1,
75   TGSI_FILE_INPUT       =2,
76   TGSI_FILE_OUTPUT      =3,
77   TGSI_FILE_TEMPORARY   =4,
78   TGSI_FILE_SAMPLER     =5,
79   TGSI_FILE_ADDRESS     =6,
80   TGSI_FILE_IMMEDIATE   =7,
81   TGSI_FILE_COUNT      /**< how many TGSI_FILE_ types */
82};
83
84
85#define TGSI_WRITEMASK_NONE     0x00
86#define TGSI_WRITEMASK_X        0x01
87#define TGSI_WRITEMASK_Y        0x02
88#define TGSI_WRITEMASK_XY       0x03
89#define TGSI_WRITEMASK_Z        0x04
90#define TGSI_WRITEMASK_XZ       0x05
91#define TGSI_WRITEMASK_YZ       0x06
92#define TGSI_WRITEMASK_XYZ      0x07
93#define TGSI_WRITEMASK_W        0x08
94#define TGSI_WRITEMASK_XW       0x09
95#define TGSI_WRITEMASK_YW       0x0A
96#define TGSI_WRITEMASK_XYW      0x0B
97#define TGSI_WRITEMASK_ZW       0x0C
98#define TGSI_WRITEMASK_XZW      0x0D
99#define TGSI_WRITEMASK_YZW      0x0E
100#define TGSI_WRITEMASK_XYZW     0x0F
101
102#define TGSI_INTERPOLATE_CONSTANT      0
103#define TGSI_INTERPOLATE_LINEAR        1
104#define TGSI_INTERPOLATE_PERSPECTIVE   2
105#define TGSI_INTERPOLATE_COUNT         3
106
107struct tgsi_declaration
108{
109   unsigned Type        : 4;  /* TGSI_TOKEN_TYPE_DECLARATION */
110   unsigned Size        : 8;  /* UINT */
111   unsigned File        : 4;  /* one of TGSI_FILE_x */
112   unsigned UsageMask   : 4;  /* bitmask of TGSI_WRITEMASK_x flags */
113   unsigned Interpolate : 4;  /* TGSI_INTERPOLATE_ */
114   unsigned Semantic    : 1;  /* BOOL, any semantic info? */
115   unsigned Centroid    : 1;  /* centroid sampling */
116   unsigned Invariant   : 1;  /* invariant optimization */
117   unsigned Padding     : 4;
118   unsigned Extended    : 1;  /* BOOL */
119};
120
121struct tgsi_declaration_range
122{
123   unsigned First   : 16; /* UINT */
124   unsigned Last    : 16; /* UINT */
125};
126
127#define TGSI_SEMANTIC_POSITION 0
128#define TGSI_SEMANTIC_COLOR    1
129#define TGSI_SEMANTIC_BCOLOR   2 /**< back-face color */
130#define TGSI_SEMANTIC_FOG      3
131#define TGSI_SEMANTIC_PSIZE    4
132#define TGSI_SEMANTIC_GENERIC  5
133#define TGSI_SEMANTIC_NORMAL   6
134#define TGSI_SEMANTIC_COUNT    7 /**< number of semantic values */
135
136struct tgsi_declaration_semantic
137{
138   unsigned SemanticName   : 8;  /* one of TGSI_SEMANTIC_ */
139   unsigned SemanticIndex  : 16; /* UINT */
140   unsigned Padding        : 8;
141};
142
143#define TGSI_IMM_FLOAT32   0
144
145struct tgsi_immediate
146{
147   unsigned Type       : 4;  /* TGSI_TOKEN_TYPE_IMMEDIATE */
148   unsigned Size       : 8;  /* UINT */
149   unsigned DataType   : 4;  /* TGSI_IMM_ */
150   unsigned Padding    : 15;
151   unsigned Extended   : 1;  /* BOOL */
152};
153
154struct tgsi_immediate_float32
155{
156   float Float;
157};
158
159/*
160 * GL_NV_vertex_program
161 */
162#define TGSI_OPCODE_ARL                 0
163#define TGSI_OPCODE_MOV                 1
164#define TGSI_OPCODE_LIT                 2
165#define TGSI_OPCODE_RCP                 3
166#define TGSI_OPCODE_RSQ                 4
167#define TGSI_OPCODE_EXP                 5
168#define TGSI_OPCODE_LOG                 6
169#define TGSI_OPCODE_MUL                 7
170#define TGSI_OPCODE_ADD                 8
171#define TGSI_OPCODE_DP3                 9
172#define TGSI_OPCODE_DP4                 10
173#define TGSI_OPCODE_DST                 11
174#define TGSI_OPCODE_MIN                 12
175#define TGSI_OPCODE_MAX                 13
176#define TGSI_OPCODE_SLT                 14
177#define TGSI_OPCODE_SGE                 15
178#define TGSI_OPCODE_MAD                 16
179
180/*
181 * GL_ATI_fragment_shader
182 */
183#define TGSI_OPCODE_SUB                 17
184#define TGSI_OPCODE_DOT3                TGSI_OPCODE_DP3
185#define TGSI_OPCODE_DOT4                TGSI_OPCODE_DP4
186#define TGSI_OPCODE_LERP                18
187#define TGSI_OPCODE_CND                 19
188#define TGSI_OPCODE_CND0                20
189#define TGSI_OPCODE_DOT2ADD             21
190
191/*
192 * GL_EXT_vertex_shader
193 */
194#define TGSI_OPCODE_INDEX               22
195#define TGSI_OPCODE_NEGATE              23
196#define TGSI_OPCODE_MADD                TGSI_OPCODE_MAD
197#define TGSI_OPCODE_FRAC                24
198#define TGSI_OPCODE_SETGE               TGSI_OPCODE_SGE
199#define TGSI_OPCODE_SETLT               TGSI_OPCODE_SLT
200#define TGSI_OPCODE_CLAMP               25
201#define TGSI_OPCODE_FLOOR               26
202#define TGSI_OPCODE_ROUND               27
203#define TGSI_OPCODE_EXPBASE2            28
204#define TGSI_OPCODE_LOGBASE2            29
205#define TGSI_OPCODE_POWER               30
206#define TGSI_OPCODE_RECIP               TGSI_OPCODE_RCP
207#define TGSI_OPCODE_RECIPSQRT           TGSI_OPCODE_RSQ
208#define TGSI_OPCODE_CROSSPRODUCT        31
209#define TGSI_OPCODE_MULTIPLYMATRIX      32
210
211/*
212 * GL_NV_vertex_program1_1
213 */
214#define TGSI_OPCODE_ABS                 33
215#define TGSI_OPCODE_RCC                 34
216#define TGSI_OPCODE_DPH                 35
217
218/*
219 * GL_NV_fragment_program
220 */
221#define TGSI_OPCODE_COS                 36
222#define TGSI_OPCODE_DDX                 37
223#define TGSI_OPCODE_DDY                 38
224#define TGSI_OPCODE_EX2                 TGSI_OPCODE_EXPBASE2
225#define TGSI_OPCODE_FLR                 TGSI_OPCODE_FLOOR
226#define TGSI_OPCODE_FRC                 TGSI_OPCODE_FRAC
227#define TGSI_OPCODE_KILP                39  /* predicated kill */
228#define TGSI_OPCODE_LG2                 TGSI_OPCODE_LOGBASE2
229#define TGSI_OPCODE_LRP                 TGSI_OPCODE_LERP
230#define TGSI_OPCODE_PK2H                40
231#define TGSI_OPCODE_PK2US               41
232#define TGSI_OPCODE_PK4B                42
233#define TGSI_OPCODE_PK4UB               43
234#define TGSI_OPCODE_POW                 TGSI_OPCODE_POWER
235#define TGSI_OPCODE_RFL                 44
236#define TGSI_OPCODE_SEQ                 45
237#define TGSI_OPCODE_SFL                 46
238#define TGSI_OPCODE_SGT                 47
239#define TGSI_OPCODE_SIN                 48
240#define TGSI_OPCODE_SLE                 49
241#define TGSI_OPCODE_SNE                 50
242#define TGSI_OPCODE_STR                 51
243#define TGSI_OPCODE_TEX                 52
244#define TGSI_OPCODE_TXD                 53
245#define TGSI_OPCODE_TXP                 54
246#define TGSI_OPCODE_UP2H                55
247#define TGSI_OPCODE_UP2US               56
248#define TGSI_OPCODE_UP4B                57
249#define TGSI_OPCODE_UP4UB               58
250#define TGSI_OPCODE_X2D                 59
251
252/*
253 * GL_NV_vertex_program2
254 */
255#define TGSI_OPCODE_ARA                 60
256#define TGSI_OPCODE_ARR                 61
257#define TGSI_OPCODE_BRA                 62
258#define TGSI_OPCODE_CAL                 63
259#define TGSI_OPCODE_RET                 64
260#define TGSI_OPCODE_SSG                 65
261
262/*
263 * GL_ARB_vertex_program
264 */
265#define TGSI_OPCODE_SWZ                 118
266#define TGSI_OPCODE_XPD                 TGSI_OPCODE_CROSSPRODUCT
267
268/*
269 * GL_ARB_fragment_program
270 */
271#define TGSI_OPCODE_CMP                 66
272#define TGSI_OPCODE_KIL                 116  /* conditional kill */
273#define TGSI_OPCODE_SCS                 67
274#define TGSI_OPCODE_TXB                 68
275
276/*
277 * GL_NV_fragment_program_option
278 */
279/* No new opcode */
280
281/*
282 * GL_NV_fragment_program2
283 */
284#define TGSI_OPCODE_NRM                 69
285#define TGSI_OPCODE_DIV                 70
286#define TGSI_OPCODE_DP2                 71
287#define TGSI_OPCODE_DP2A                TGSI_OPCODE_DOT2ADD
288#define TGSI_OPCODE_TXL                 72
289#define TGSI_OPCODE_BRK                 73
290#define TGSI_OPCODE_IF                  74
291#define TGSI_OPCODE_LOOP                75
292#define TGSI_OPCODE_REP                 76
293#define TGSI_OPCODE_ELSE                77
294#define TGSI_OPCODE_ENDIF               78
295#define TGSI_OPCODE_ENDLOOP             79
296#define TGSI_OPCODE_ENDREP              80
297
298/*
299 * GL_NV_vertex_program2_option
300 */
301
302/*
303 * GL_NV_vertex_program3
304 */
305#define TGSI_OPCODE_PUSHA               81
306#define TGSI_OPCODE_POPA                82
307
308/*
309 * GL_NV_gpu_program4
310 */
311#define TGSI_OPCODE_CEIL                83
312#define TGSI_OPCODE_I2F                 84
313#define TGSI_OPCODE_NOT                 85
314#define TGSI_OPCODE_TRUNC               86
315#define TGSI_OPCODE_SHL                 87
316#define TGSI_OPCODE_SHR                 88
317#define TGSI_OPCODE_AND                 89
318#define TGSI_OPCODE_OR                  90
319#define TGSI_OPCODE_MOD                 91
320#define TGSI_OPCODE_XOR                 92
321#define TGSI_OPCODE_SAD                 93
322#define TGSI_OPCODE_TXF                 94
323#define TGSI_OPCODE_TXQ                 95
324#define TGSI_OPCODE_CONT                96
325
326/*
327 * GL_NV_vertex_program4
328 */
329/* Same as GL_NV_gpu_program4 */
330
331/*
332 * GL_NV_fragment_program4
333 */
334/* Same as GL_NV_gpu_program4 */
335
336/*
337 * GL_NV_geometry_program4
338 */
339/* Same as GL_NV_gpu_program4 */
340#define TGSI_OPCODE_EMIT                97
341#define TGSI_OPCODE_ENDPRIM             98
342
343/*
344 * GLSL
345 */
346#define TGSI_OPCODE_BGNLOOP2            99
347#define TGSI_OPCODE_BGNSUB              100
348#define TGSI_OPCODE_ENDLOOP2            101
349#define TGSI_OPCODE_ENDSUB              102
350#define TGSI_OPCODE_INT                 TGSI_OPCODE_TRUNC
351#define TGSI_OPCODE_NOISE1              103
352#define TGSI_OPCODE_NOISE2              104
353#define TGSI_OPCODE_NOISE3              105
354#define TGSI_OPCODE_NOISE4              106
355#define TGSI_OPCODE_NOP                 107
356
357/*
358 * ps_1_1
359 */
360#define TGSI_OPCODE_TEXKILL             TGSI_OPCODE_KIL
361
362/*
363 * ps_1_2
364 */
365/* CMP - use TGSI_OPCODE_CND0 */
366
367/*
368 * ps_1_3
369 */
370/* CMP - use TGSI_OPCODE_CND0 */
371
372/*
373 * ps_1_4
374 */
375#define TGSI_OPCODE_TEXLD               TGSI_OPCODE_TEX
376
377/*
378 * ps_2_0
379 */
380#define TGSI_OPCODE_M4X4                TGSI_OPCODE_MULTIPLYMATRIX
381#define TGSI_OPCODE_M4X3                108
382#define TGSI_OPCODE_M3X4                109
383#define TGSI_OPCODE_M3X3                110
384#define TGSI_OPCODE_M3X2                111
385#define TGSI_OPCODE_CRS                 TGSI_OPCODE_XPD
386#define TGSI_OPCODE_NRM4                112
387#define TGSI_OPCODE_SINCOS              TGSI_OPCODE_SCS
388#define TGSI_OPCODE_TEXLDB              TGSI_OPCODE_TXB
389#define TGSI_OPCODE_DP2ADD              TGSI_OPCODE_DP2A
390
391/*
392 * ps_2_x
393 */
394#define TGSI_OPCODE_CALL                TGSI_OPCODE_CAL
395#define TGSI_OPCODE_CALLNZ              113
396#define TGSI_OPCODE_IFC                 114
397#define TGSI_OPCODE_BREAK               TGSI_OPCODE_BRK
398#define TGSI_OPCODE_BREAKC              115
399#define TGSI_OPCODE_DSX                 TGSI_OPCODE_DDX
400#define TGSI_OPCODE_DSY                 TGSI_OPCODE_DDY
401#define TGSI_OPCODE_TEXLDD              TGSI_OPCODE_TXD
402
403/*
404 * vs_1_1
405 */
406#define TGSI_OPCODE_EXPP                TGSI_OPCODE_EXP
407#define TGSI_OPCODE_LOGP                TGSI_OPCODE_LG2
408
409/*
410 * vs_2_0
411 */
412#define TGSI_OPCODE_SGN                 TGSI_OPCODE_SSG
413#define TGSI_OPCODE_MOVA                TGSI_OPCODE_ARR
414/* EXPP - use TGSI_OPCODE_EX2 */
415
416/*
417 * vs_2_x
418 */
419
420#define TGSI_OPCODE_END                 117  /* aka HALT */
421
422#define TGSI_OPCODE_LAST                119
423
424#define TGSI_SAT_NONE            0  /* do not saturate */
425#define TGSI_SAT_ZERO_ONE        1  /* clamp to [0,1] */
426#define TGSI_SAT_MINUS_PLUS_ONE  2  /* clamp to [-1,1] */
427
428/**
429 * Opcode is the operation code to execute. A given operation defines the
430 * semantics how the source registers (if any) are interpreted and what is
431 * written to the destination registers (if any) as a result of execution.
432 *
433 * NumDstRegs and NumSrcRegs is the number of destination and source registers,
434 * respectively. For a given operation code, those numbers are fixed and are
435 * present here only for convenience.
436 *
437 * If Extended is TRUE, it is now executed.
438 *
439 * Saturate controls how are final results in destination registers modified.
440 */
441
442struct tgsi_instruction
443{
444   unsigned Type       : 4;  /* TGSI_TOKEN_TYPE_INSTRUCTION */
445   unsigned Size       : 8;  /* UINT */
446   unsigned Opcode     : 8;  /* TGSI_OPCODE_ */
447   unsigned Saturate   : 2;  /* TGSI_SAT_ */
448   unsigned NumDstRegs : 2;  /* UINT */
449   unsigned NumSrcRegs : 4;  /* UINT */
450   unsigned Padding    : 3;
451   unsigned Extended   : 1;  /* BOOL */
452};
453
454/*
455 * If tgsi_instruction::Extended is TRUE, tgsi_instruction_ext follows.
456 *
457 * Then, tgsi_instruction::NumDstRegs of tgsi_dst_register follow.
458 *
459 * Then, tgsi_instruction::NumSrcRegs of tgsi_src_register follow.
460 *
461 * tgsi_instruction::Size contains the total number of words that make the
462 * instruction, including the instruction word.
463 */
464
465#define TGSI_INSTRUCTION_EXT_TYPE_NV        0
466#define TGSI_INSTRUCTION_EXT_TYPE_LABEL     1
467#define TGSI_INSTRUCTION_EXT_TYPE_TEXTURE   2
468#define TGSI_INSTRUCTION_EXT_TYPE_PREDICATE 3
469
470struct tgsi_instruction_ext
471{
472   unsigned Type       : 4;  /* TGSI_INSTRUCTION_EXT_TYPE_ */
473   unsigned Padding    : 27;
474   unsigned Extended   : 1;  /* BOOL */
475};
476
477/*
478 * If tgsi_instruction_ext::Type is TGSI_INSTRUCTION_EXT_TYPE_NV, it should
479 * be cast to tgsi_instruction_ext_nv.
480 *
481 * If tgsi_instruction_ext::Type is TGSI_INSTRUCTION_EXT_TYPE_LABEL, it
482 * should be cast to tgsi_instruction_ext_label.
483 *
484 * If tgsi_instruction_ext::Type is TGSI_INSTRUCTION_EXT_TYPE_TEXTURE, it
485 * should be cast to tgsi_instruction_ext_texture.
486 *
487 * If tgsi_instruction_ext::Type is TGSI_INSTRUCTION_EXT_TYPE_PREDICATE, it
488 * should be cast to tgsi_instruction_ext_predicate.
489 *
490 * If tgsi_instruction_ext::Extended is TRUE, another tgsi_instruction_ext
491 * follows.
492 */
493
494#define TGSI_PRECISION_DEFAULT      0
495#define TGSI_PRECISION_FLOAT32      1
496#define TGSI_PRECISION_FLOAT16      2
497#define TGSI_PRECISION_FIXED12      3
498
499#define TGSI_CC_GT      0
500#define TGSI_CC_EQ      1
501#define TGSI_CC_LT      2
502#define TGSI_CC_GE      3
503#define TGSI_CC_LE      4
504#define TGSI_CC_NE      5
505#define TGSI_CC_TR      6
506#define TGSI_CC_FL      7
507
508#define TGSI_SWIZZLE_X      0
509#define TGSI_SWIZZLE_Y      1
510#define TGSI_SWIZZLE_Z      2
511#define TGSI_SWIZZLE_W      3
512
513/**
514 * Precision controls the precision at which the operation should be executed.
515 *
516 * CondDstUpdate enables condition code register writes. When this field is
517 * TRUE, CondDstIndex specifies the index of the condition code register to
518 * update.
519 *
520 * CondFlowEnable enables conditional execution of the operation. When this
521 * field is TRUE, CondFlowIndex specifies the index of the condition code
522 * register to test against CondMask with component swizzle controled by
523 * CondSwizzleX, CondSwizzleY, CondSwizzleZ and CondSwizzleW. If the test fails,
524 * the operation is not executed.
525 */
526
527struct tgsi_instruction_ext_nv
528{
529   unsigned Type             : 4;    /* TGSI_INSTRUCTION_EXT_TYPE_NV */
530   unsigned Precision        : 4;    /* TGSI_PRECISION_ */
531   unsigned CondDstIndex     : 4;    /* UINT */
532   unsigned CondFlowIndex    : 4;    /* UINT */
533   unsigned CondMask         : 4;    /* TGSI_CC_ */
534   unsigned CondSwizzleX     : 2;    /* TGSI_SWIZZLE_ */
535   unsigned CondSwizzleY     : 2;    /* TGSI_SWIZZLE_ */
536   unsigned CondSwizzleZ     : 2;    /* TGSI_SWIZZLE_ */
537   unsigned CondSwizzleW     : 2;    /* TGSI_SWIZZLE_ */
538   unsigned CondDstUpdate    : 1;    /* BOOL */
539   unsigned CondFlowEnable   : 1;    /* BOOL */
540   unsigned Padding          : 1;
541   unsigned Extended         : 1;    /* BOOL */
542};
543
544struct tgsi_instruction_ext_label
545{
546   unsigned Type     : 4;    /* TGSI_INSTRUCTION_EXT_TYPE_LABEL */
547   unsigned Label    : 24;   /* UINT */
548   unsigned Padding  : 3;
549   unsigned Extended : 1;    /* BOOL */
550};
551
552#define TGSI_TEXTURE_UNKNOWN        0
553#define TGSI_TEXTURE_1D             1
554#define TGSI_TEXTURE_2D             2
555#define TGSI_TEXTURE_3D             3
556#define TGSI_TEXTURE_CUBE           4
557#define TGSI_TEXTURE_RECT           5
558#define TGSI_TEXTURE_SHADOW1D       6
559#define TGSI_TEXTURE_SHADOW2D       7
560#define TGSI_TEXTURE_SHADOWRECT     8
561#define TGSI_TEXTURE_COUNT          9
562
563struct tgsi_instruction_ext_texture
564{
565   unsigned Type     : 4;    /* TGSI_INSTRUCTION_EXT_TYPE_TEXTURE */
566   unsigned Texture  : 8;    /* TGSI_TEXTURE_ */
567   unsigned Padding  : 19;
568   unsigned Extended : 1;    /* BOOL */
569};
570
571struct tgsi_instruction_ext_predicate
572{
573   unsigned Type             : 4;    /* TGSI_INSTRUCTION_EXT_TYPE_PREDICATE */
574   unsigned PredDstIndex     : 4;    /* UINT */
575   unsigned PredWriteMask    : 4;    /* TGSI_WRITEMASK_ */
576   unsigned Padding          : 19;
577   unsigned Extended         : 1;    /* BOOL */
578};
579
580/**
581 * File specifies the register array to access.
582 *
583 * Index specifies the element number of a register in the register file.
584 *
585 * If Indirect is TRUE, Index should be offset by the X component of a source
586 * register that follows. The register can be now fetched into local storage
587 * for further processing.
588 *
589 * If Negate is TRUE, all components of the fetched register are negated.
590 *
591 * The fetched register components are swizzled according to SwizzleX, SwizzleY,
592 * SwizzleZ and SwizzleW.
593 *
594 * If Extended is TRUE, any further modifications to the source register are
595 * made to this temporary storage.
596 */
597
598struct tgsi_src_register
599{
600   unsigned File        : 4;  /* TGSI_FILE_ */
601   unsigned SwizzleX    : 2;  /* TGSI_SWIZZLE_ */
602   unsigned SwizzleY    : 2;  /* TGSI_SWIZZLE_ */
603   unsigned SwizzleZ    : 2;  /* TGSI_SWIZZLE_ */
604   unsigned SwizzleW    : 2;  /* TGSI_SWIZZLE_ */
605   unsigned Negate      : 1;  /* BOOL */
606   unsigned Indirect    : 1;  /* BOOL */
607   unsigned Dimension   : 1;  /* BOOL */
608   int      Index       : 16; /* SINT */
609   unsigned Extended    : 1;  /* BOOL */
610};
611
612/**
613 * If tgsi_src_register::Extended is TRUE, tgsi_src_register_ext follows.
614 *
615 * Then, if tgsi_src_register::Indirect is TRUE, another tgsi_src_register
616 * follows.
617 *
618 * Then, if tgsi_src_register::Dimension is TRUE, tgsi_dimension follows.
619 */
620
621#define TGSI_SRC_REGISTER_EXT_TYPE_SWZ      0
622#define TGSI_SRC_REGISTER_EXT_TYPE_MOD      1
623
624struct tgsi_src_register_ext
625{
626   unsigned Type     : 4;    /* TGSI_SRC_REGISTER_EXT_TYPE_ */
627   unsigned Padding  : 27;
628   unsigned Extended : 1;    /* BOOL */
629};
630
631/**
632 * If tgsi_src_register_ext::Type is TGSI_SRC_REGISTER_EXT_TYPE_SWZ,
633 * it should be cast to tgsi_src_register_ext_swz.
634 *
635 * If tgsi_src_register_ext::Type is TGSI_SRC_REGISTER_EXT_TYPE_MOD,
636 * it should be cast to tgsi_src_register_ext_mod.
637 *
638 * If tgsi_dst_register_ext::Extended is TRUE, another tgsi_dst_register_ext
639 * follows.
640 */
641
642#define TGSI_EXTSWIZZLE_X       TGSI_SWIZZLE_X
643#define TGSI_EXTSWIZZLE_Y       TGSI_SWIZZLE_Y
644#define TGSI_EXTSWIZZLE_Z       TGSI_SWIZZLE_Z
645#define TGSI_EXTSWIZZLE_W       TGSI_SWIZZLE_W
646#define TGSI_EXTSWIZZLE_ZERO    4
647#define TGSI_EXTSWIZZLE_ONE     5
648
649/**
650 * ExtSwizzleX, ExtSwizzleY, ExtSwizzleZ and ExtSwizzleW swizzle the source
651 * register in an extended manner.
652 *
653 * NegateX, NegateY, NegateZ and NegateW negate individual components of the
654 * source register.
655 *
656 * NOTE: To simplify matter, if this token is present, the corresponding Swizzle
657 *       and Negate fields in tgsi_src_register should be set to X,Y,Z,W
658 *       and FALSE, respectively.
659 */
660
661struct tgsi_src_register_ext_swz
662{
663   unsigned Type         : 4;    /* TGSI_SRC_REGISTER_EXT_TYPE_SWZ */
664   unsigned ExtSwizzleX  : 4;    /* TGSI_EXTSWIZZLE_ */
665   unsigned ExtSwizzleY  : 4;    /* TGSI_EXTSWIZZLE_ */
666   unsigned ExtSwizzleZ  : 4;    /* TGSI_EXTSWIZZLE_ */
667   unsigned ExtSwizzleW  : 4;    /* TGSI_EXTSWIZZLE_ */
668   unsigned NegateX      : 1;    /* BOOL */
669   unsigned NegateY      : 1;    /* BOOL */
670   unsigned NegateZ      : 1;    /* BOOL */
671   unsigned NegateW      : 1;    /* BOOL */
672   unsigned Padding      : 7;
673   unsigned Extended     : 1;    /* BOOL */
674};
675
676/**
677 * Extra src register modifiers
678 *
679 * If Complement is TRUE, the source register is modified by subtracting it
680 * from 1.0.
681 *
682 * If Bias is TRUE, the source register is modified by subtracting 0.5 from it.
683 *
684 * If Scale2X is TRUE, the source register is modified by multiplying it by 2.0.
685 *
686 * If Absolute is TRUE, the source register is modified by removing the sign.
687 *
688 * If Negate is TRUE, the source register is modified by negating it.
689 */
690
691struct tgsi_src_register_ext_mod
692{
693   unsigned Type         : 4;    /* TGSI_SRC_REGISTER_EXT_TYPE_MOD */
694   unsigned Complement   : 1;    /* BOOL */
695   unsigned Bias         : 1;    /* BOOL */
696   unsigned Scale2X      : 1;    /* BOOL */
697   unsigned Absolute     : 1;    /* BOOL */
698   unsigned Negate       : 1;    /* BOOL */
699   unsigned Padding      : 22;
700   unsigned Extended     : 1;    /* BOOL */
701};
702
703struct tgsi_dimension
704{
705   unsigned Indirect    : 1;  /* BOOL */
706   unsigned Dimension   : 1;  /* BOOL */
707   unsigned Padding     : 13;
708   int      Index       : 16; /* SINT */
709   unsigned Extended    : 1;  /* BOOL */
710};
711
712struct tgsi_dst_register
713{
714   unsigned File        : 4;  /* TGSI_FILE_ */
715   unsigned WriteMask   : 4;  /* TGSI_WRITEMASK_ */
716   unsigned Indirect    : 1;  /* BOOL */
717   unsigned Dimension   : 1;  /* BOOL */
718   int      Index       : 16; /* SINT */
719   unsigned Padding     : 5;
720   unsigned Extended    : 1;  /* BOOL */
721};
722
723/*
724 * If tgsi_dst_register::Extended is TRUE, tgsi_dst_register_ext follows.
725 *
726 * Then, if tgsi_dst_register::Indirect is TRUE, tgsi_src_register follows.
727 */
728
729#define TGSI_DST_REGISTER_EXT_TYPE_CONDCODE     0
730#define TGSI_DST_REGISTER_EXT_TYPE_MODULATE     1
731#define TGSI_DST_REGISTER_EXT_TYPE_PREDICATE    2
732
733struct tgsi_dst_register_ext
734{
735   unsigned Type     : 4;    /* TGSI_DST_REGISTER_EXT_TYPE_ */
736   unsigned Padding  : 27;
737   unsigned Extended : 1;    /* BOOL */
738};
739
740/**
741 * Extra destination register modifiers
742 *
743 * If tgsi_dst_register_ext::Type is TGSI_DST_REGISTER_EXT_TYPE_CONDCODE,
744 * it should be cast to tgsi_dst_register_ext_condcode.
745 *
746 * If tgsi_dst_register_ext::Type is TGSI_DST_REGISTER_EXT_TYPE_MODULATE,
747 * it should be cast to tgsi_dst_register_ext_modulate.
748 *
749 * If tgsi_dst_register_ext::Type is TGSI_DST_REGISTER_EXT_TYPE_PREDICATE,
750 * it should be cast to tgsi_dst_register_ext_predicate.
751 *
752 * If tgsi_dst_register_ext::Extended is TRUE, another tgsi_dst_register_ext
753 * follows.
754 */
755struct tgsi_dst_register_ext_concode
756{
757   unsigned Type         : 4;    /* TGSI_DST_REGISTER_EXT_TYPE_CONDCODE */
758   unsigned CondMask     : 4;    /* TGSI_CC_ */
759   unsigned CondSwizzleX : 2;    /* TGSI_SWIZZLE_ */
760   unsigned CondSwizzleY : 2;    /* TGSI_SWIZZLE_ */
761   unsigned CondSwizzleZ : 2;    /* TGSI_SWIZZLE_ */
762   unsigned CondSwizzleW : 2;    /* TGSI_SWIZZLE_ */
763   unsigned CondSrcIndex : 4;    /* UINT */
764   unsigned Padding      : 11;
765   unsigned Extended     : 1;    /* BOOL */
766};
767
768#define TGSI_MODULATE_1X        0
769#define TGSI_MODULATE_2X        1
770#define TGSI_MODULATE_4X        2
771#define TGSI_MODULATE_8X        3
772#define TGSI_MODULATE_HALF      4
773#define TGSI_MODULATE_QUARTER   5
774#define TGSI_MODULATE_EIGHTH    6
775#define TGSI_MODULATE_COUNT     7
776
777struct tgsi_dst_register_ext_modulate
778{
779   unsigned Type     : 4;    /* TGSI_DST_REGISTER_EXT_TYPE_MODULATE */
780   unsigned Modulate : 4;    /* TGSI_MODULATE_ */
781   unsigned Padding  : 23;
782   unsigned Extended : 1;    /* BOOL */
783};
784
785/*
786 * Currently, the following constraints apply.
787 *
788 * - PredSwizzleXYZW is either set to identity or replicate.
789 * - PredSrcIndex is 0.
790 */
791
792struct tgsi_dst_register_ext_predicate
793{
794   unsigned Type         : 4;    /* TGSI_DST_REGISTER_EXT_TYPE_PREDICATE */
795   unsigned PredSwizzleX : 2;    /* TGSI_SWIZZLE_ */
796   unsigned PredSwizzleY : 2;    /* TGSI_SWIZZLE_ */
797   unsigned PredSwizzleZ : 2;    /* TGSI_SWIZZLE_ */
798   unsigned PredSwizzleW : 2;    /* TGSI_SWIZZLE_ */
799   unsigned PredSrcIndex : 4;    /* UINT */
800   unsigned Negate       : 1;    /* BOOL */
801   unsigned Padding      : 14;
802   unsigned Extended     : 1;    /* BOOL */
803};
804
805
806#ifdef __cplusplus
807}
808#endif
809
810#endif /* TGSI_TOKEN_H */
811
812