OSDN Git Service

builtins: Add the mix(gentype, gentype, float) variant.
[android-x86/external-mesa.git] / glsl_types.h
1 /* -*- c++ -*- */
2 /*
3  * Copyright © 2009 Intel Corporation
4  *
5  * Permission is hereby granted, free of charge, to any person obtaining a
6  * copy of this software and associated documentation files (the "Software"),
7  * to deal in the Software without restriction, including without limitation
8  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9  * and/or sell copies of the Software, and to permit persons to whom the
10  * Software is furnished to do so, subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice (including the next
13  * paragraph) shall be included in all copies or substantial portions of the
14  * Software.
15  *
16  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
17  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
18  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
19  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
20  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
21  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
22  * DEALINGS IN THE SOFTWARE.
23  */
24
25 #pragma once
26 #ifndef GLSL_TYPES_H
27 #define GLSL_TYPES_H
28
29 #include <cstring>
30 #include <cassert>
31
32 #define GLSL_TYPE_UINT          0
33 #define GLSL_TYPE_INT           1
34 #define GLSL_TYPE_FLOAT         2
35 #define GLSL_TYPE_BOOL          3
36 #define GLSL_TYPE_SAMPLER       4
37 #define GLSL_TYPE_STRUCT        5
38 #define GLSL_TYPE_ARRAY         6
39 #define GLSL_TYPE_FUNCTION      7
40 #define GLSL_TYPE_VOID          8
41 #define GLSL_TYPE_ERROR         9
42
43 enum glsl_sampler_dim {
44    GLSL_SAMPLER_DIM_1D = 0,
45    GLSL_SAMPLER_DIM_2D,
46    GLSL_SAMPLER_DIM_3D,
47    GLSL_SAMPLER_DIM_CUBE,
48    GLSL_SAMPLER_DIM_RECT,
49    GLSL_SAMPLER_DIM_BUF
50 };
51
52
53 struct glsl_type {
54    unsigned base_type:4;
55
56    unsigned sampler_dimensionality:3;
57    unsigned sampler_shadow:1;
58    unsigned sampler_array:1;
59    unsigned sampler_type:2;    /**< Type of data returned using this sampler.
60                                 * only \c GLSL_TYPE_FLOAT, \c GLSL_TYPE_INT,
61                                 * and \c GLSL_TYPE_UINT are valid.
62                                 */
63
64    /**
65     * \name Vector and matrix element counts
66     *
67     * For scalars, each of these values will be 1.  For non-numeric types
68     * these will be 0.
69     */
70    /*@{*/
71    unsigned vector_elements:3; /**< 1, 2, 3, or 4 vector elements. */
72    unsigned matrix_columns:3;  /**< 1, 2, 3, or 4 matrix columns. */
73    /*@}*/
74
75    /**
76     * Name of the data type
77     *
78     * This may be \c NULL for anonymous structures, for arrays, or for
79     * function types.
80     */
81    const char *name;
82
83    /**
84     * For \c GLSL_TYPE_ARRAY, this is the length of the array.  For
85     * \c GLSL_TYPE_STRUCT, it is the number of elements in the structure and
86     * the number of values pointed to by \c fields.structure (below).
87     *
88     * For \c GLSL_TYPE_FUNCTION, it is the number of parameters to the
89     * function.  The return value from a function is implicitly the first
90     * parameter.  The types of the parameters are stored in
91     * \c fields.parameters (below).
92     */
93    unsigned length;
94
95    /**
96     * Subtype of composite data types.
97     */
98    union {
99       const struct glsl_type *array;            /**< Type of array elements. */
100       const struct glsl_type *parameters;       /**< Parameters to function. */
101       const struct glsl_struct_field *structure;/**< List of struct fields. */
102    } fields;
103
104
105    /**
106     * \name Pointers to various public type singletons
107     */
108    /*@{*/
109    static const glsl_type *const error_type;
110    static const glsl_type *const int_type;
111    static const glsl_type *const uint_type;
112    static const glsl_type *const float_type;
113    static const glsl_type *const vec2_type;
114    static const glsl_type *const vec3_type;
115    static const glsl_type *const vec4_type;
116    static const glsl_type *const bool_type;
117    static const glsl_type *const mat2_type;
118    static const glsl_type *const mat2x3_type;
119    static const glsl_type *const mat2x4_type;
120    static const glsl_type *const mat3x2_type;
121    static const glsl_type *const mat3_type;
122    static const glsl_type *const mat3x4_type;
123    static const glsl_type *const mat4x2_type;
124    static const glsl_type *const mat4x3_type;
125    static const glsl_type *const mat4_type;
126    /*@}*/
127
128
129    glsl_type(unsigned base_type, unsigned vector_elements,
130              unsigned matrix_columns, const char *name) :
131       base_type(base_type), 
132       sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
133       sampler_type(0),
134       vector_elements(vector_elements), matrix_columns(matrix_columns),
135       name(name),
136       length(0)
137    {
138       /* Neither dimension is zero or both dimensions are zero.
139        */
140       assert((vector_elements == 0) == (matrix_columns == 0));
141       memset(& fields, 0, sizeof(fields));
142    }
143
144    glsl_type(enum glsl_sampler_dim dim, bool shadow, bool array,
145              unsigned type, const char *name) :
146       base_type(GLSL_TYPE_SAMPLER),
147       sampler_dimensionality(dim), sampler_shadow(shadow),
148       sampler_array(array), sampler_type(type),
149       vector_elements(0), matrix_columns(0),
150       name(name),
151       length(0)
152    {
153       memset(& fields, 0, sizeof(fields));
154    }
155
156    glsl_type(const glsl_struct_field *fields, unsigned num_fields,
157              const char *name) :
158       base_type(GLSL_TYPE_STRUCT),
159       sampler_dimensionality(0), sampler_shadow(0), sampler_array(0),
160       sampler_type(0),
161       vector_elements(0), matrix_columns(0),
162       name(name),
163       length(num_fields)
164    {
165       this->fields.structure = fields;
166    }
167
168    /**
169     * For numeric and boolean derrived types returns the basic scalar type
170     *
171     * If the type is a numeric or boolean scalar, vector, or matrix type,
172     * this function gets the scalar type of the individual components.  For
173     * all other types, including arrays of numeric or boolean types, the
174     * error type is returned.
175     */
176    const glsl_type *get_base_type() const;
177
178    /**
179     * Query the type of elements in an array
180     *
181     * \return
182     * Pointer to the type of elements in the array for array types, or \c NULL
183     * for non-array types.
184     */
185    const glsl_type *element_type() const
186    {
187       return is_array() ? fields.array : NULL;
188    }
189
190    /**
191     * Get the instance of a built-in scalar, vector, or matrix type
192     */
193    static const glsl_type *get_instance(unsigned base_type, unsigned rows,
194                                         unsigned columns);
195
196    /**
197     * Get the instance of an array type
198     */
199    static const glsl_type *get_array_instance(const glsl_type *base,
200                                               unsigned elements);
201
202    /**
203     * Generate the constructor for this type and add it to the symbol table
204     */
205    class ir_function *generate_constructor(class glsl_symbol_table *) const;
206
207    /**
208     * Query the total number of scalars that make up a scalar, vector or matrix
209     */
210    unsigned components() const
211    {
212       return vector_elements * matrix_columns;
213    }
214
215    /**
216     * Query whether or not a type is a scalar (non-vector and non-matrix).
217     */
218    bool is_scalar() const
219    {
220       return (vector_elements == 1)
221          && (base_type >= GLSL_TYPE_UINT)
222          && (base_type <= GLSL_TYPE_BOOL);
223    }
224
225    /**
226     * Query whether or not a type is a vector
227     */
228    bool is_vector() const
229    {
230       return (vector_elements > 1)
231          && (matrix_columns == 1)
232          && (base_type >= GLSL_TYPE_UINT)
233          && (base_type <= GLSL_TYPE_BOOL);
234    }
235
236    /**
237     * Query whether or not a type is a matrix
238     */
239    bool is_matrix() const
240    {
241       /* GLSL only has float matrices. */
242       return (matrix_columns > 1) && (base_type == GLSL_TYPE_FLOAT);
243    }
244
245    /**
246     * Query whether or not a type is a non-array numeric type
247     */
248    bool is_numeric() const
249    {
250       return (base_type >= GLSL_TYPE_UINT) && (base_type <= GLSL_TYPE_FLOAT);
251    }
252
253    /**
254     * Query whether or not a type is an integral type
255     */
256    bool is_integer() const
257    {
258       return (base_type == GLSL_TYPE_UINT) || (base_type == GLSL_TYPE_INT);
259    }
260
261    /**
262     * Query whether or not a type is a float type
263     */
264    bool is_float() const
265    {
266       return base_type == GLSL_TYPE_FLOAT;
267    }
268
269    /**
270     * Query whether or not a type is a non-array boolean type
271     */
272    bool is_boolean() const
273    {
274       return base_type == GLSL_TYPE_BOOL;
275    }
276
277    /**
278     * Query whether or not a type is a sampler
279     */
280    bool is_sampler() const
281    {
282       return base_type == GLSL_TYPE_SAMPLER;
283    }
284
285    /**
286     * Query whether or not a type is an array
287     */
288    bool is_array() const
289    {
290       return base_type == GLSL_TYPE_ARRAY;
291    }
292
293    /**
294     * Query whether or not a type is the void type singleton.
295     */
296    bool is_void() const
297    {
298       return base_type == GLSL_TYPE_VOID;
299    }
300
301    /**
302     * Query whether or not a type is the error type singleton.
303     */
304    bool is_error() const
305    {
306       return base_type == GLSL_TYPE_ERROR;
307    }
308
309    /**
310     * Query the full type of a matrix row
311     *
312     * \return
313     * If the type is not a matrix, \c glsl_type::error_type is returned.
314     * Otherwise a type matching the rows of the matrix is returned.
315     */
316    const glsl_type *row_type() const
317    {
318       return is_matrix()
319          ? get_instance(base_type, matrix_columns, 1)
320          : error_type;
321    }
322
323    /**
324     * Query the full type of a matrix column
325     *
326     * \return
327     * If the type is not a matrix, \c glsl_type::error_type is returned.
328     * Otherwise a type matching the columns of the matrix is returned.
329     */
330    const glsl_type *column_type() const
331    {
332       return is_matrix()
333          ? get_instance(base_type, vector_elements, 1)
334          : error_type;
335    }
336
337
338    /**
339     * Get the type of a structure field
340     *
341     * \return
342     * Pointer to the type of the named field.  If the type is not a structure
343     * or the named field does not exist, \c glsl_type::error_type is returned.
344     */
345    const glsl_type *field_type(const char *name) const;
346
347
348    /**
349     * Query the number of elements in an array type
350     *
351     * \return
352     * The number of elements in the array for array types or -1 for non-array
353     * types.  If the number of elements in the array has not yet been declared,
354     * zero is returned.
355     */
356    int array_size() const
357    {
358       return is_array() ? length : -1;
359    }
360
361 private:
362    /**
363     * Constructor for array types
364     */
365    glsl_type(const glsl_type *array, unsigned length);
366
367    /** Hash table containing the known array types. */
368    static struct hash_table *array_types;
369
370    static int array_key_compare(const void *a, const void *b);
371    static unsigned array_key_hash(const void *key);
372 };
373
374 struct glsl_struct_field {
375    const struct glsl_type *type;
376    const char *name;
377 };
378
379 struct _mesa_glsl_parse_state;
380
381 #ifdef __cplusplus
382 extern "C" {
383 #endif
384
385 extern void
386 _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state);
387
388 extern void
389 _mesa_glsl_initialize_constructors(struct exec_list *instructions,
390                                    struct _mesa_glsl_parse_state *state);
391
392 #ifdef __cplusplus
393 }
394 #endif
395
396 #endif /* GLSL_TYPES_H */