Merge branch 'master' of git+ssh://keithw@git.freedesktop.org/git/mesa/mesa into...
[mesa.git] / src / mesa / shader / slang / slang_compile_operation.h
1 /*
2 * Mesa 3-D graphics library
3 * Version: 6.5.2
4 *
5 * Copyright (C) 2005-2006 Brian Paul 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 "Software"),
9 * to deal in the Software without restriction, including without limitation
10 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
11 * and/or sell copies of the Software, and to permit persons to whom the
12 * Software is furnished to do so, subject to the following conditions:
13 *
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
16 *
17 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
18 * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
20 * BRIAN PAUL BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN
21 * AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
22 * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25 #ifndef SLANG_COMPILE_OPERATION_H
26 #define SLANG_COMPILE_OPERATION_H
27
28 #if defined __cplusplus
29 extern "C" {
30 #endif
31
32
33 /**
34 * Types of slang operations.
35 * These are the types of the AST (abstract syntax tree) nodes.
36 * [foo] indicates a sub-tree or reference to another type of node
37 */
38 typedef enum slang_operation_type_
39 {
40 slang_oper_none,
41 slang_oper_block_no_new_scope, /* "{" sequence "}" */
42 slang_oper_block_new_scope, /* "{" sequence "}" */
43 slang_oper_variable_decl, /* [type] [var] or [var] = [expr] */
44 slang_oper_asm,
45 slang_oper_break, /* "break" statement */
46 slang_oper_continue, /* "continue" statement */
47 slang_oper_discard, /* "discard" (kill fragment) statement */
48 slang_oper_return, /* "return" [expr] */
49 slang_oper_expression, /* [expr] */
50 slang_oper_if, /* "if" [0] then [1] else [2] */
51 slang_oper_while, /* "while" [cond] [body] */
52 slang_oper_do, /* "do" [body] "while" [cond] */
53 slang_oper_for, /* "for" [init] [while] [incr] [body] */
54 slang_oper_void, /* nop */
55 slang_oper_literal_bool, /* "true" or "false" */
56 slang_oper_literal_int, /* integer literal */
57 slang_oper_literal_float, /* float literal */
58 slang_oper_identifier, /* var name, func name, etc */
59 slang_oper_sequence, /* [expr] "," [expr] "," etc */
60 slang_oper_assign, /* [var] "=" [expr] */
61 slang_oper_addassign, /* [var] "+=" [expr] */
62 slang_oper_subassign, /* [var] "-=" [expr] */
63 slang_oper_mulassign, /* [var] "*=" [expr] */
64 slang_oper_divassign, /* [var] "/=" [expr] */
65 /*slang_oper_modassign, */
66 /*slang_oper_lshassign, */
67 /*slang_oper_rshassign, */
68 /*slang_oper_orassign, */
69 /*slang_oper_xorassign, */
70 /*slang_oper_andassign, */
71 slang_oper_select, /* [expr] "?" [expr] ":" [expr] */
72 slang_oper_logicalor, /* [expr] "||" [expr] */
73 slang_oper_logicalxor, /* [expr] "^^" [expr] */
74 slang_oper_logicaland, /* [expr] "&&" [expr] */
75 /*slang_oper_bitor, */
76 /*slang_oper_bitxor, */
77 /*slang_oper_bitand, */
78 slang_oper_equal, /* [expr] "==" [expr] */
79 slang_oper_notequal, /* [expr] "!=" [expr] */
80 slang_oper_less, /* [expr] "<" [expr] */
81 slang_oper_greater, /* [expr] ">" [expr] */
82 slang_oper_lessequal, /* [expr] "<=" [expr] */
83 slang_oper_greaterequal, /* [expr] ">=" [expr] */
84 /*slang_oper_lshift, */
85 /*slang_oper_rshift, */
86 slang_oper_add, /* [expr] "+" [expr] */
87 slang_oper_subtract, /* [expr] "-" [expr] */
88 slang_oper_multiply, /* [expr] "*" [expr] */
89 slang_oper_divide, /* [expr] "/" [expr] */
90 /*slang_oper_modulus, */
91 slang_oper_preincrement, /* "++" [var] */
92 slang_oper_predecrement, /* "--" [var] */
93 slang_oper_plus, /* "-" [expr] */
94 slang_oper_minus, /* "+" [expr] */
95 /*slang_oper_complement, */
96 slang_oper_not, /* "!" [expr] */
97 slang_oper_subscript, /* [expr] "[" [expr] "]" */
98 slang_oper_call, /* [func name] [param] [param] [...] */
99 slang_oper_field, /* i.e.: ".next" or ".xzy" or ".xxx" etc */
100 slang_oper_postincrement, /* [var] "++" */
101 slang_oper_postdecrement /* [var] "--" */
102 } slang_operation_type;
103
104
105 /**
106 * A slang_operation is basically a compiled instruction (such as assignment,
107 * a while-loop, a conditional, a multiply, a function call, etc).
108 * The AST (abstract syntax tree) is built from these nodes.
109 * NOTE: This structure could have been implemented as a union of simpler
110 * structs which would correspond to the operation types above.
111 */
112 typedef struct slang_operation_
113 {
114 slang_operation_type type;
115 struct slang_operation_ *children;
116 GLuint num_children;
117 GLfloat literal; /**< Used for float, int and bool values */
118 slang_atom a_id; /**< type: asm, identifier, call, field */
119 slang_variable_scope *locals; /**< local vars for scope */
120 } slang_operation;
121
122
123 extern GLboolean
124 slang_operation_construct(slang_operation *);
125
126 extern void
127 slang_operation_destruct(slang_operation *);
128
129 extern GLboolean
130 slang_operation_copy(slang_operation *, const slang_operation *);
131
132 extern slang_operation *
133 slang_operation_new(GLuint count);
134
135
136 #ifdef __cplusplus
137 }
138 #endif
139
140 #endif /* SLANG_COMPILE_OPERATION_H */