2 * Mesa 3-D graphics library
5 * Copyright (C) 2005 Brian Paul All Rights Reserved.
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:
14 * The above copyright notice and this permission notice shall be included
15 * in all copies or substantial portions of the Software.
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.
25 #if !defined SLANG_COMPILE_H
26 #define SLANG_COMPILE_H
28 #if defined __cplusplus
32 typedef enum slang_type_qualifier_
41 slang_qual_fixedoutput
, /* internal */
42 slang_qual_fixedinput
/* internal */
43 } slang_type_qualifier
;
45 typedef enum slang_type_specifier_type_
66 slang_spec_samplerCube
,
67 slang_spec_sampler1DShadow
,
68 slang_spec_sampler2DShadow
,
71 } slang_type_specifier_type
;
73 slang_type_specifier_type
slang_type_specifier_type_from_string (const char *);
75 typedef struct slang_type_specifier_
77 slang_type_specifier_type type
;
78 struct slang_struct_
*_struct
; /* spec_struct */
79 struct slang_type_specifier_
*_array
; /* spec_array */
80 } slang_type_specifier
;
82 void slang_type_specifier_construct (slang_type_specifier
*);
83 void slang_type_specifier_destruct (slang_type_specifier
*);
84 int slang_type_specifier_copy (slang_type_specifier
*, const slang_type_specifier
*);
85 int slang_type_specifier_equal (const slang_type_specifier
*, const slang_type_specifier
*);
87 typedef struct slang_fully_specified_type_
89 slang_type_qualifier qualifier
;
90 slang_type_specifier specifier
;
91 } slang_fully_specified_type
;
93 typedef struct slang_variable_scope_
95 struct slang_variable_
*variables
;
96 unsigned int num_variables
;
97 struct slang_variable_scope_
*outer_scope
;
98 } slang_variable_scope
;
100 typedef enum slang_operation_type_
103 slang_oper_block_no_new_scope
,
104 slang_oper_block_new_scope
,
105 slang_oper_variable_decl
,
111 slang_oper_expression
,
117 slang_oper_literal_bool
,
118 slang_oper_literal_int
,
119 slang_oper_literal_float
,
120 slang_oper_identifier
,
123 slang_oper_addassign
,
124 slang_oper_subassign
,
125 slang_oper_mulassign
,
126 slang_oper_divassign
,
127 /*slang_oper_modassign,*/
128 /*slang_oper_lshassign,*/
129 /*slang_oper_rshassign,*/
130 /*slang_oper_orassign,*/
131 /*slang_oper_xorassign,*/
132 /*slang_oper_andassign,*/
134 slang_oper_logicalor
,
135 slang_oper_logicalxor
,
136 slang_oper_logicaland
,
137 /*slang_oper_bitor,*/
138 /*slang_oper_bitxor,*/
139 /*slang_oper_bitand,*/
144 slang_oper_lessequal
,
145 slang_oper_greaterequal
,
146 /*slang_oper_lshift,*/
147 /*slang_oper_rshift,*/
152 /*slang_oper_modulus,*/
153 slang_oper_preincrement
,
154 slang_oper_predecrement
,
157 /*slang_oper_complement,*/
159 slang_oper_subscript
,
162 slang_oper_postincrement
,
163 slang_oper_postdecrement
164 } slang_operation_type
;
166 typedef struct slang_operation_
168 slang_operation_type type
;
169 struct slang_operation_
*children
;
170 unsigned int num_children
;
171 float literal
; /* bool, literal_int, literal_float */
172 char *identifier
; /* asm, identifier, call, field */
173 slang_variable_scope
*locals
;
176 int slang_operation_construct_a (slang_operation
*);
177 void slang_operation_destruct (slang_operation
*);
179 typedef struct slang_variable_
181 slang_fully_specified_type type
;
183 slang_operation
*array_size
; /* spec_array */
184 slang_operation
*initializer
;
185 unsigned int address
;
188 slang_variable
*_slang_locate_variable (slang_variable_scope
*scope
, const char *name
, int all
);
190 typedef struct slang_struct_scope_
192 struct slang_struct_
*structs
;
193 unsigned int num_structs
;
194 struct slang_struct_scope_
*outer_scope
;
195 } slang_struct_scope
;
197 struct slang_struct_
*slang_struct_scope_find (slang_struct_scope
*, const char *, int);
199 typedef struct slang_struct_
202 slang_variable_scope
*fields
;
203 slang_struct_scope
*structs
;
206 int slang_struct_construct_a (slang_struct
*);
207 int slang_struct_copy (slang_struct
*, const slang_struct
*);
209 typedef enum slang_function_kind_
212 slang_func_constructor
,
214 } slang_function_kind
;
216 typedef struct slang_function_
218 slang_function_kind kind
;
219 slang_variable header
;
220 slang_variable_scope
*parameters
;
221 unsigned int param_count
;
222 slang_operation
*body
;
223 unsigned int address
;
226 typedef struct slang_function_scope_
228 slang_function
*functions
;
229 unsigned int num_functions
;
230 struct slang_function_scope_
*outer_scope
;
231 } slang_function_scope
;
233 typedef enum slang_unit_type_
235 slang_unit_fragment_shader
,
236 slang_unit_vertex_shader
,
237 slang_unit_fragment_builtin
,
238 slang_unit_vertex_builtin
241 typedef struct slang_translation_unit_
243 slang_variable_scope globals
;
244 slang_function_scope functions
;
245 slang_struct_scope structs
;
246 slang_unit_type type
;
247 } slang_translation_unit
;
249 void slang_translation_unit_construct (slang_translation_unit
*);
250 void slang_translation_unit_destruct (slang_translation_unit
*);
252 typedef struct slang_info_log_
258 void slang_info_log_construct (slang_info_log
*);
259 void slang_info_log_destruct (slang_info_log
*);
260 int slang_info_log_error (slang_info_log
*, const char *, ...);
261 int slang_info_log_warning (slang_info_log
*, const char *, ...);
262 void slang_info_log_memory (slang_info_log
*);
264 int _slang_compile (const char *, slang_translation_unit
*, slang_unit_type type
, slang_info_log
*);