OSDN Git Service

Merge branch 'mesa_7_6_branch' into mesa_7_7_branch
[android-x86/external-mesa.git] / src / gallium / include / pipe / p_shader_tokens.h
1 /**************************************************************************
2  * 
3  * Copyright 2008 Tungsten Graphics, Inc., Cedar Park, Texas.
4  * Copyright 2009 VMware, Inc.
5  * All Rights Reserved.
6  * 
7  * Permission is hereby granted, free of charge, to any person obtaining a
8  * copy of this software and associated documentation files (the
9  * "Software"), to deal in the Software without restriction, including
10  * without limitation the rights to use, copy, modify, merge, publish,
11  * distribute, sub license, and/or sell copies of the Software, and to
12  * permit persons to whom the Software is furnished to do so, subject to
13  * the following conditions:
14  * 
15  * The above copyright notice and this permission notice (including the
16  * next paragraph) shall be included in all copies or substantial portions
17  * of the Software.
18  * 
19  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
20  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
21  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
22  * IN NO EVENT SHALL TUNGSTEN GRAPHICS AND/OR ITS SUPPLIERS BE LIABLE FOR
23  * ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
24  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
25  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
26  * 
27  **************************************************************************/
28
29 #ifndef P_SHADER_TOKENS_H
30 #define P_SHADER_TOKENS_H
31
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35
36 #include "p_compiler.h"
37
38 struct tgsi_version
39 {
40    unsigned MajorVersion  : 8;
41    unsigned MinorVersion  : 8;
42    unsigned Padding       : 16;
43 };
44
45 struct tgsi_header
46 {
47    unsigned HeaderSize : 8;
48    unsigned BodySize   : 24;
49 };
50
51 #define TGSI_PROCESSOR_FRAGMENT  0
52 #define TGSI_PROCESSOR_VERTEX    1
53 #define TGSI_PROCESSOR_GEOMETRY  2
54
55 struct tgsi_processor
56 {
57    unsigned Processor  : 4;  /* TGSI_PROCESSOR_ */
58    unsigned Padding    : 28;
59 };
60
61 #define TGSI_TOKEN_TYPE_DECLARATION    0
62 #define TGSI_TOKEN_TYPE_IMMEDIATE      1
63 #define TGSI_TOKEN_TYPE_INSTRUCTION    2
64
65 struct tgsi_token
66 {
67    unsigned Type       : 4;  /**< TGSI_TOKEN_TYPE_x */
68    unsigned NrTokens   : 8;  /**< UINT */
69    unsigned Padding    : 19;
70    unsigned Extended   : 1;  /**< BOOL */
71 };
72
73 enum tgsi_file_type {
74    TGSI_FILE_NULL        =0,
75    TGSI_FILE_CONSTANT    =1,
76    TGSI_FILE_INPUT       =2,
77    TGSI_FILE_OUTPUT      =3,
78    TGSI_FILE_TEMPORARY   =4,
79    TGSI_FILE_SAMPLER     =5,
80    TGSI_FILE_ADDRESS     =6,
81    TGSI_FILE_IMMEDIATE   =7,
82    TGSI_FILE_LOOP        =8,
83    TGSI_FILE_PREDICATE   =9,
84    TGSI_FILE_COUNT      /**< how many TGSI_FILE_ types */
85 };
86
87
88 #define TGSI_WRITEMASK_NONE     0x00
89 #define TGSI_WRITEMASK_X        0x01
90 #define TGSI_WRITEMASK_Y        0x02
91 #define TGSI_WRITEMASK_XY       0x03
92 #define TGSI_WRITEMASK_Z        0x04
93 #define TGSI_WRITEMASK_XZ       0x05
94 #define TGSI_WRITEMASK_YZ       0x06
95 #define TGSI_WRITEMASK_XYZ      0x07
96 #define TGSI_WRITEMASK_W        0x08
97 #define TGSI_WRITEMASK_XW       0x09
98 #define TGSI_WRITEMASK_YW       0x0A
99 #define TGSI_WRITEMASK_XYW      0x0B
100 #define TGSI_WRITEMASK_ZW       0x0C
101 #define TGSI_WRITEMASK_XZW      0x0D
102 #define TGSI_WRITEMASK_YZW      0x0E
103 #define TGSI_WRITEMASK_XYZW     0x0F
104
105 #define TGSI_INTERPOLATE_CONSTANT      0
106 #define TGSI_INTERPOLATE_LINEAR        1
107 #define TGSI_INTERPOLATE_PERSPECTIVE   2
108 #define TGSI_INTERPOLATE_COUNT         3
109
110 struct tgsi_declaration
111 {
112    unsigned Type        : 4;  /**< TGSI_TOKEN_TYPE_DECLARATION */
113    unsigned NrTokens    : 8;  /**< UINT */
114    unsigned File        : 4;  /**< one of TGSI_FILE_x */
115    unsigned UsageMask   : 4;  /**< bitmask of TGSI_WRITEMASK_x flags */
116    unsigned Interpolate : 4;  /**< one of TGSI_INTERPOLATE_x */
117    unsigned Semantic    : 1;  /**< BOOL, any semantic info? */
118    unsigned Centroid    : 1;  /**< centroid sampling? */
119    unsigned Invariant   : 1;  /**< invariant optimization? */
120    unsigned Padding     : 4;
121    unsigned Extended    : 1;  /**< BOOL */
122 };
123
124 struct tgsi_declaration_range
125 {
126    unsigned First   : 16; /**< UINT */
127    unsigned Last    : 16; /**< UINT */
128 };
129
130 #define TGSI_SEMANTIC_POSITION 0
131 #define TGSI_SEMANTIC_COLOR    1
132 #define TGSI_SEMANTIC_BCOLOR   2 /**< back-face color */
133 #define TGSI_SEMANTIC_FOG      3
134 #define TGSI_SEMANTIC_PSIZE    4
135 #define TGSI_SEMANTIC_GENERIC  5
136 #define TGSI_SEMANTIC_NORMAL   6
137 #define TGSI_SEMANTIC_FACE     7
138 #define TGSI_SEMANTIC_COUNT    8 /**< number of semantic values */
139
140 struct tgsi_declaration_semantic
141 {
142    unsigned SemanticName   : 8;  /**< one of TGSI_SEMANTIC_x */
143    unsigned SemanticIndex  : 16; /**< UINT */
144    unsigned Padding        : 8;
145 };
146
147 #define TGSI_IMM_FLOAT32   0
148
149 struct tgsi_immediate
150 {
151    unsigned Type       : 4;  /**< TGSI_TOKEN_TYPE_IMMEDIATE */
152    unsigned NrTokens   : 8;  /**< UINT */
153    unsigned DataType   : 4;  /**< one of TGSI_IMM_x */
154    unsigned Padding    : 15;
155    unsigned Extended   : 1;  /**< BOOL */
156 };
157
158 union tgsi_immediate_data
159 {
160    float Float;
161 };
162
163 /* TGSI opcodes.  
164  * 
165  * For more information on semantics of opcodes and
166  * which APIs are known to use which opcodes, see
167  * auxiliary/tgsi/tgsi-instruction-set.txt
168  */
169 #define TGSI_OPCODE_ARL                 0
170 #define TGSI_OPCODE_MOV                 1
171 #define TGSI_OPCODE_LIT                 2
172 #define TGSI_OPCODE_RCP                 3
173 #define TGSI_OPCODE_RSQ                 4
174 #define TGSI_OPCODE_EXP                 5
175 #define TGSI_OPCODE_LOG                 6
176 #define TGSI_OPCODE_MUL                 7
177 #define TGSI_OPCODE_ADD                 8
178 #define TGSI_OPCODE_DP3                 9
179 #define TGSI_OPCODE_DP4                 10
180 #define TGSI_OPCODE_DST                 11
181 #define TGSI_OPCODE_MIN                 12
182 #define TGSI_OPCODE_MAX                 13
183 #define TGSI_OPCODE_SLT                 14
184 #define TGSI_OPCODE_SGE                 15
185 #define TGSI_OPCODE_MAD                 16
186 #define TGSI_OPCODE_SUB                 17
187 #define TGSI_OPCODE_LRP                 18
188 #define TGSI_OPCODE_CND                 19
189                                 /* gap */
190 #define TGSI_OPCODE_DP2A                21
191                                 /* gap */
192 #define TGSI_OPCODE_FRC                 24
193 #define TGSI_OPCODE_CLAMP               25
194 #define TGSI_OPCODE_FLR                 26
195 #define TGSI_OPCODE_ROUND               27
196 #define TGSI_OPCODE_EX2                 28
197 #define TGSI_OPCODE_LG2                 29
198 #define TGSI_OPCODE_POW                 30
199 #define TGSI_OPCODE_XPD                 31
200                                 /* gap */
201 #define TGSI_OPCODE_ABS                 33
202 #define TGSI_OPCODE_RCC                 34
203 #define TGSI_OPCODE_DPH                 35
204 #define TGSI_OPCODE_COS                 36
205 #define TGSI_OPCODE_DDX                 37
206 #define TGSI_OPCODE_DDY                 38
207 #define TGSI_OPCODE_KILP                39  /* predicated kill */
208 #define TGSI_OPCODE_PK2H                40
209 #define TGSI_OPCODE_PK2US               41
210 #define TGSI_OPCODE_PK4B                42
211 #define TGSI_OPCODE_PK4UB               43
212 #define TGSI_OPCODE_RFL                 44
213 #define TGSI_OPCODE_SEQ                 45
214 #define TGSI_OPCODE_SFL                 46
215 #define TGSI_OPCODE_SGT                 47
216 #define TGSI_OPCODE_SIN                 48
217 #define TGSI_OPCODE_SLE                 49
218 #define TGSI_OPCODE_SNE                 50
219 #define TGSI_OPCODE_STR                 51
220 #define TGSI_OPCODE_TEX                 52
221 #define TGSI_OPCODE_TXD                 53
222 #define TGSI_OPCODE_TXP                 54
223 #define TGSI_OPCODE_UP2H                55
224 #define TGSI_OPCODE_UP2US               56
225 #define TGSI_OPCODE_UP4B                57
226 #define TGSI_OPCODE_UP4UB               58
227 #define TGSI_OPCODE_X2D                 59
228 #define TGSI_OPCODE_ARA                 60
229 #define TGSI_OPCODE_ARR                 61
230 #define TGSI_OPCODE_BRA                 62
231 #define TGSI_OPCODE_CAL                 63
232 #define TGSI_OPCODE_RET                 64
233 #define TGSI_OPCODE_SSG                 65 /* SGN */
234 #define TGSI_OPCODE_CMP                 66
235 #define TGSI_OPCODE_SCS                 67
236 #define TGSI_OPCODE_TXB                 68
237 #define TGSI_OPCODE_NRM                 69
238 #define TGSI_OPCODE_DIV                 70
239 #define TGSI_OPCODE_DP2                 71
240 #define TGSI_OPCODE_TXL                 72
241 #define TGSI_OPCODE_BRK                 73
242 #define TGSI_OPCODE_IF                  74
243 #define TGSI_OPCODE_BGNFOR              75
244 #define TGSI_OPCODE_REP                 76
245 #define TGSI_OPCODE_ELSE                77
246 #define TGSI_OPCODE_ENDIF               78
247 #define TGSI_OPCODE_ENDFOR              79
248 #define TGSI_OPCODE_ENDREP              80
249 #define TGSI_OPCODE_PUSHA               81
250 #define TGSI_OPCODE_POPA                82
251 #define TGSI_OPCODE_CEIL                83
252 #define TGSI_OPCODE_I2F                 84
253 #define TGSI_OPCODE_NOT                 85
254 #define TGSI_OPCODE_TRUNC               86
255 #define TGSI_OPCODE_SHL                 87
256 #define TGSI_OPCODE_SHR                 88
257 #define TGSI_OPCODE_AND                 89
258 #define TGSI_OPCODE_OR                  90
259 #define TGSI_OPCODE_MOD                 91
260 #define TGSI_OPCODE_XOR                 92
261 #define TGSI_OPCODE_SAD                 93
262 #define TGSI_OPCODE_TXF                 94
263 #define TGSI_OPCODE_TXQ                 95
264 #define TGSI_OPCODE_CONT                96
265 #define TGSI_OPCODE_EMIT                97
266 #define TGSI_OPCODE_ENDPRIM             98
267 #define TGSI_OPCODE_BGNLOOP             99
268 #define TGSI_OPCODE_BGNSUB              100
269 #define TGSI_OPCODE_ENDLOOP             101
270 #define TGSI_OPCODE_ENDSUB              102
271                                 /* gap */
272 #define TGSI_OPCODE_NOP                 107
273                                 /* gap */
274 #define TGSI_OPCODE_NRM4                112
275 #define TGSI_OPCODE_CALLNZ              113
276 #define TGSI_OPCODE_IFC                 114
277 #define TGSI_OPCODE_BREAKC              115
278 #define TGSI_OPCODE_KIL                 116  /* conditional kill */
279 #define TGSI_OPCODE_END                 117  /* aka HALT */
280                                 /* gap */
281 #define TGSI_OPCODE_LAST                119
282
283 #define TGSI_SAT_NONE            0  /* do not saturate */
284 #define TGSI_SAT_ZERO_ONE        1  /* clamp to [0,1] */
285 #define TGSI_SAT_MINUS_PLUS_ONE  2  /* clamp to [-1,1] */
286
287 /**
288  * Opcode is the operation code to execute. A given operation defines the
289  * semantics how the source registers (if any) are interpreted and what is
290  * written to the destination registers (if any) as a result of execution.
291  *
292  * NumDstRegs and NumSrcRegs is the number of destination and source registers,
293  * respectively. For a given operation code, those numbers are fixed and are
294  * present here only for convenience.
295  *
296  * If Extended is TRUE, it is now executed.
297  *
298  * Saturate controls how are final results in destination registers modified.
299  */
300
301 struct tgsi_instruction
302 {
303    unsigned Type       : 4;  /* TGSI_TOKEN_TYPE_INSTRUCTION */
304    unsigned NrTokens   : 8;  /* UINT */
305    unsigned Opcode     : 8;  /* TGSI_OPCODE_ */
306    unsigned Saturate   : 2;  /* TGSI_SAT_ */
307    unsigned NumDstRegs : 2;  /* UINT */
308    unsigned NumSrcRegs : 4;  /* UINT */
309    unsigned Padding    : 3;
310    unsigned Extended   : 1;  /* BOOL */
311 };
312
313 /*
314  * If tgsi_instruction::Extended is TRUE, tgsi_instruction_ext follows.
315  * 
316  * Then, tgsi_instruction::NumDstRegs of tgsi_dst_register follow.
317  * 
318  * Then, tgsi_instruction::NumSrcRegs of tgsi_src_register follow.
319  *
320  * tgsi_instruction::NrTokens contains the total number of words that make the
321  * instruction, including the instruction word.
322  */
323
324 #define TGSI_INSTRUCTION_EXT_TYPE_LABEL     1
325 #define TGSI_INSTRUCTION_EXT_TYPE_TEXTURE   2
326 #define TGSI_INSTRUCTION_EXT_TYPE_PREDICATE 3
327
328 struct tgsi_instruction_ext
329 {
330    unsigned Type       : 4;  /* TGSI_INSTRUCTION_EXT_TYPE_ */
331    unsigned Padding    : 27;
332    unsigned Extended   : 1;  /* BOOL */
333 };
334
335 /*
336  * If tgsi_instruction_ext::Type is TGSI_INSTRUCTION_EXT_TYPE_LABEL, it
337  * should be cast to tgsi_instruction_ext_label.
338  * 
339  * If tgsi_instruction_ext::Type is TGSI_INSTRUCTION_EXT_TYPE_TEXTURE, it
340  * should be cast to tgsi_instruction_ext_texture.
341  * 
342  * If tgsi_instruction_ext::Type is TGSI_INSTRUCTION_EXT_TYPE_PREDICATE, it
343  * should be cast to tgsi_instruction_ext_predicate.
344  * 
345  * If tgsi_instruction_ext::Extended is TRUE, another tgsi_instruction_ext
346  * follows.
347  */
348
349 #define TGSI_SWIZZLE_X      0
350 #define TGSI_SWIZZLE_Y      1
351 #define TGSI_SWIZZLE_Z      2
352 #define TGSI_SWIZZLE_W      3
353
354 struct tgsi_instruction_ext_label
355 {
356    unsigned Type     : 4;    /* TGSI_INSTRUCTION_EXT_TYPE_LABEL */
357    unsigned Label    : 24;   /* UINT */
358    unsigned Padding  : 3;
359    unsigned Extended : 1;    /* BOOL */
360 };
361
362 #define TGSI_TEXTURE_UNKNOWN        0
363 #define TGSI_TEXTURE_1D             1
364 #define TGSI_TEXTURE_2D             2
365 #define TGSI_TEXTURE_3D             3
366 #define TGSI_TEXTURE_CUBE           4
367 #define TGSI_TEXTURE_RECT           5
368 #define TGSI_TEXTURE_SHADOW1D       6
369 #define TGSI_TEXTURE_SHADOW2D       7
370 #define TGSI_TEXTURE_SHADOWRECT     8
371 #define TGSI_TEXTURE_COUNT          9
372
373 struct tgsi_instruction_ext_texture
374 {
375    unsigned Type     : 4;    /* TGSI_INSTRUCTION_EXT_TYPE_TEXTURE */
376    unsigned Texture  : 8;    /* TGSI_TEXTURE_ */
377    unsigned Padding  : 19;
378    unsigned Extended : 1;    /* BOOL */
379 };
380
381 /*
382  * For SM3, the following constraint applies.
383  *   - Swizzle is either set to identity or replicate.
384  */
385 struct tgsi_instruction_ext_predicate
386 {
387    unsigned Type     : 4;  /* TGSI_INSTRUCTION_EXT_TYPE_PREDICATE */
388    unsigned SwizzleX : 2;  /* TGSI_SWIZZLE_x */
389    unsigned SwizzleY : 2;  /* TGSI_SWIZZLE_x */
390    unsigned SwizzleZ : 2;  /* TGSI_SWIZZLE_x */
391    unsigned SwizzleW : 2;  /* TGSI_SWIZZLE_x */
392    unsigned Negate   : 1;  /* BOOL */
393    unsigned SrcIndex : 8;  /* UINT */
394    unsigned Padding  : 10;
395    unsigned Extended : 1;  /* BOOL */
396 };
397
398 /**
399  * File specifies the register array to access.
400  *
401  * Index specifies the element number of a register in the register file.
402  *
403  * If Indirect is TRUE, Index should be offset by the X component of a source
404  * register that follows. The register can be now fetched into local storage
405  * for further processing.
406  *
407  * If Negate is TRUE, all components of the fetched register are negated.
408  *
409  * The fetched register components are swizzled according to SwizzleX, SwizzleY,
410  * SwizzleZ and SwizzleW.
411  *
412  * If Extended is TRUE, any further modifications to the source register are
413  * made to this temporary storage.
414  */
415
416 struct tgsi_src_register
417 {
418    unsigned File        : 4;  /* TGSI_FILE_ */
419    unsigned SwizzleX    : 2;  /* TGSI_SWIZZLE_ */
420    unsigned SwizzleY    : 2;  /* TGSI_SWIZZLE_ */
421    unsigned SwizzleZ    : 2;  /* TGSI_SWIZZLE_ */
422    unsigned SwizzleW    : 2;  /* TGSI_SWIZZLE_ */
423    unsigned Negate      : 1;  /* BOOL */
424    unsigned Indirect    : 1;  /* BOOL */
425    unsigned Dimension   : 1;  /* BOOL */
426    int      Index       : 16; /* SINT */
427    unsigned Extended    : 1;  /* BOOL */
428 };
429
430 /**
431  * If tgsi_src_register::Extended is TRUE, tgsi_src_register_ext follows.
432  * 
433  * Then, if tgsi_src_register::Indirect is TRUE, another tgsi_src_register
434  * follows.
435  *
436  * Then, if tgsi_src_register::Dimension is TRUE, tgsi_dimension follows.
437  */
438
439 #define TGSI_SRC_REGISTER_EXT_TYPE_MOD      1
440
441 struct tgsi_src_register_ext
442 {
443    unsigned Type     : 4;    /* TGSI_SRC_REGISTER_EXT_TYPE_ */
444    unsigned Padding  : 27;
445    unsigned Extended : 1;    /* BOOL */
446 };
447
448 /**
449  * If tgsi_src_register_ext::Type is TGSI_SRC_REGISTER_EXT_TYPE_MOD,
450  * it should be cast to tgsi_src_register_ext_mod.
451  * 
452  * If tgsi_dst_register_ext::Extended is TRUE, another tgsi_dst_register_ext
453  * follows.
454  */
455
456
457 /**
458  * Extra src register modifiers
459  *
460  * If Complement is TRUE, the source register is modified by subtracting it
461  * from 1.0.
462  *
463  * If Bias is TRUE, the source register is modified by subtracting 0.5 from it.
464  *
465  * If Scale2X is TRUE, the source register is modified by multiplying it by 2.0.
466  *
467  * If Absolute is TRUE, the source register is modified by removing the sign.
468  *
469  * If Negate is TRUE, the source register is modified by negating it.
470  */
471
472 struct tgsi_src_register_ext_mod
473 {
474    unsigned Type         : 4;    /* TGSI_SRC_REGISTER_EXT_TYPE_MOD */
475    unsigned Complement   : 1;    /* BOOL */
476    unsigned Bias         : 1;    /* BOOL */
477    unsigned Scale2X      : 1;    /* BOOL */
478    unsigned Absolute     : 1;    /* BOOL */
479    unsigned Negate       : 1;    /* BOOL */
480    unsigned Padding      : 22;
481    unsigned Extended     : 1;    /* BOOL */
482 };
483
484 struct tgsi_dimension
485 {
486    unsigned Indirect    : 1;  /* BOOL */
487    unsigned Dimension   : 1;  /* BOOL */
488    unsigned Padding     : 13;
489    int      Index       : 16; /* SINT */
490    unsigned Extended    : 1;  /* BOOL */
491 };
492
493 struct tgsi_dst_register
494 {
495    unsigned File        : 4;  /* TGSI_FILE_ */
496    unsigned WriteMask   : 4;  /* TGSI_WRITEMASK_ */
497    unsigned Indirect    : 1;  /* BOOL */
498    unsigned Dimension   : 1;  /* BOOL */
499    int      Index       : 16; /* SINT */
500    unsigned Padding     : 5;
501    unsigned Extended    : 1;  /* BOOL */
502 };
503
504 /*
505  * If tgsi_dst_register::Extended is TRUE, tgsi_dst_register_ext follows.
506  * 
507  * Then, if tgsi_dst_register::Indirect is TRUE, tgsi_src_register follows.
508  */
509
510 #define TGSI_DST_REGISTER_EXT_TYPE_MODULATE     1
511
512 struct tgsi_dst_register_ext
513 {
514    unsigned Type     : 4;    /* TGSI_DST_REGISTER_EXT_TYPE_ */
515    unsigned Padding  : 27;
516    unsigned Extended : 1;    /* BOOL */
517 };
518
519 /**
520  * Extra destination register modifiers
521  *
522  * If tgsi_dst_register_ext::Type is TGSI_DST_REGISTER_EXT_TYPE_MODULATE,
523  * it should be cast to tgsi_dst_register_ext_modulate.
524  * 
525  * If tgsi_dst_register_ext::Extended is TRUE, another tgsi_dst_register_ext
526  * follows.
527  */
528
529 #define TGSI_MODULATE_1X        0
530 #define TGSI_MODULATE_2X        1
531 #define TGSI_MODULATE_4X        2
532 #define TGSI_MODULATE_8X        3
533 #define TGSI_MODULATE_HALF      4
534 #define TGSI_MODULATE_QUARTER   5
535 #define TGSI_MODULATE_EIGHTH    6
536 #define TGSI_MODULATE_COUNT     7
537
538 struct tgsi_dst_register_ext_modulate
539 {
540    unsigned Type     : 4;    /* TGSI_DST_REGISTER_EXT_TYPE_MODULATE */
541    unsigned Modulate : 4;    /* TGSI_MODULATE_ */
542    unsigned Padding  : 23;
543    unsigned Extended : 1;    /* BOOL */
544 };
545
546 #ifdef __cplusplus
547 }
548 #endif
549
550 #endif /* P_SHADER_TOKENS_H */