• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 extern "C" {
33 #include "GLES2/gl2.h"
34 #include <hieralloc.h>
35 }
36 
37 struct _mesa_glsl_parse_state;
38 struct glsl_symbol_table;
39 
40 extern "C" void
41 _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state);
42 
43 extern "C" void
44 _mesa_glsl_release_types(void);
45 
46 enum glsl_base_type {
47    GLSL_TYPE_UINT = 0,
48    GLSL_TYPE_INT,
49    GLSL_TYPE_FLOAT,
50    GLSL_TYPE_BOOL,
51    GLSL_TYPE_SAMPLER,
52    GLSL_TYPE_STRUCT,
53    GLSL_TYPE_ARRAY,
54    GLSL_TYPE_VOID,
55    GLSL_TYPE_ERROR
56 };
57 
58 enum glsl_sampler_dim {
59    GLSL_SAMPLER_DIM_1D = 0,
60    GLSL_SAMPLER_DIM_2D,
61    GLSL_SAMPLER_DIM_3D,
62    GLSL_SAMPLER_DIM_CUBE,
63    GLSL_SAMPLER_DIM_RECT,
64    GLSL_SAMPLER_DIM_BUF
65 };
66 
67 
68 struct glsl_type {
69    GLenum gl_type;
70    glsl_base_type base_type;
71 
72    unsigned sampler_dimensionality:3;
73    unsigned sampler_shadow:1;
74    unsigned sampler_array:1;
75    unsigned sampler_type:2;    /**< Type of data returned using this sampler.
76 				* only \c GLSL_TYPE_FLOAT, \c GLSL_TYPE_INT,
77 				* and \c GLSL_TYPE_UINT are valid.
78 				*/
79 
80    /* Callers of this hieralloc-based new need not call delete. It's
81     * easier to just hieralloc_free 'mem_ctx' (or any of its ancestors). */
newglsl_type82    static void* operator new(size_t size)
83    {
84       if (glsl_type::mem_ctx == NULL) {
85 	 glsl_type::mem_ctx = hieralloc_init("glsl_type");
86 	 assert(glsl_type::mem_ctx != NULL);
87       }
88 
89       void *type;
90 
91       type = hieralloc_size(glsl_type::mem_ctx, size);
92       assert(type != NULL);
93 
94       return type;
95    }
96 
97    /* If the user *does* call delete, that's OK, we will just
98     * hieralloc_free in that case. */
deleteglsl_type99    static void operator delete(void *type)
100    {
101       hieralloc_free(type);
102    }
103 
104    /**
105     * \name Vector and matrix element counts
106     *
107     * For scalars, each of these values will be 1.  For non-numeric types
108     * these will be 0.
109     */
110    /*@{*/
111    unsigned vector_elements:3; /**< 1, 2, 3, or 4 vector elements. */
112    unsigned matrix_columns:3;  /**< 1, 2, 3, or 4 matrix columns. */
113    /*@}*/
114 
115    /**
116     * Name of the data type
117     *
118     * This may be \c NULL for anonymous structures, for arrays, or for
119     * function types.
120     */
121    const char *name;
122 
123    /**
124     * For \c GLSL_TYPE_ARRAY, this is the length of the array.  For
125     * \c GLSL_TYPE_STRUCT, it is the number of elements in the structure and
126     * the number of values pointed to by \c fields.structure (below).
127     */
128    unsigned length;
129 
130    /**
131     * Subtype of composite data types.
132     */
133    union {
134       const struct glsl_type *array;            /**< Type of array elements. */
135       const struct glsl_type *parameters;       /**< Parameters to function. */
136       struct glsl_struct_field *structure;      /**< List of struct fields. */
137    } fields;
138 
139 
140    /**
141     * \name Pointers to various public type singletons
142     */
143    /*@{*/
144    static const glsl_type *const error_type;
145    static const glsl_type *const int_type;
146    static const glsl_type *const ivec4_type;
147    static const glsl_type *const uint_type;
148    static const glsl_type *const uvec2_type;
149    static const glsl_type *const uvec3_type;
150    static const glsl_type *const uvec4_type;
151    static const glsl_type *const float_type;
152    static const glsl_type *const vec2_type;
153    static const glsl_type *const vec3_type;
154    static const glsl_type *const vec4_type;
155    static const glsl_type *const bool_type;
156    static const glsl_type *const mat2_type;
157    static const glsl_type *const mat2x3_type;
158    static const glsl_type *const mat2x4_type;
159    static const glsl_type *const mat3x2_type;
160    static const glsl_type *const mat3_type;
161    static const glsl_type *const mat3x4_type;
162    static const glsl_type *const mat4x2_type;
163    static const glsl_type *const mat4x3_type;
164    static const glsl_type *const mat4_type;
165    /*@}*/
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     */
element_typeglsl_type185    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     * Get the instance of a record type
204     */
205    static const glsl_type *get_record_instance(const glsl_struct_field *fields,
206 					       unsigned num_fields,
207 					       const char *name);
208 
209    /**
210     * Query the total number of scalars that make up a scalar, vector or matrix
211     */
componentsglsl_type212    unsigned components() const
213    {
214       return vector_elements * matrix_columns;
215    }
216 
217    /**
218     * Calculate the number of components slots required to hold this type
219     *
220     * This is used to determine how many uniform or varying locations a type
221     * might occupy.
222     */
223    unsigned component_slots() const;
224 
225 
226    /**
227     * Query whether or not a type is a scalar (non-vector and non-matrix).
228     */
is_scalarglsl_type229    bool is_scalar() const
230    {
231       return (vector_elements == 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 vector
238     */
is_vectorglsl_type239    bool is_vector() const
240    {
241       return (vector_elements > 1)
242 	 && (matrix_columns == 1)
243 	 && (base_type >= GLSL_TYPE_UINT)
244 	 && (base_type <= GLSL_TYPE_BOOL);
245    }
246 
247    /**
248     * Query whether or not a type is a matrix
249     */
is_matrixglsl_type250    bool is_matrix() const
251    {
252       /* GLSL only has float matrices. */
253       return (matrix_columns > 1) && (base_type == GLSL_TYPE_FLOAT);
254    }
255 
256    /**
257     * Query whether or not a type is a non-array numeric type
258     */
is_numericglsl_type259    bool is_numeric() const
260    {
261       return (base_type >= GLSL_TYPE_UINT) && (base_type <= GLSL_TYPE_FLOAT);
262    }
263 
264    /**
265     * Query whether or not a type is an integral type
266     */
is_integerglsl_type267    bool is_integer() const
268    {
269       return (base_type == GLSL_TYPE_UINT) || (base_type == GLSL_TYPE_INT);
270    }
271 
272    /**
273     * Query whether or not a type is a float type
274     */
is_floatglsl_type275    bool is_float() const
276    {
277       return base_type == GLSL_TYPE_FLOAT;
278    }
279 
280    /**
281     * Query whether or not a type is a non-array boolean type
282     */
is_booleanglsl_type283    bool is_boolean() const
284    {
285       return base_type == GLSL_TYPE_BOOL;
286    }
287 
288    /**
289     * Query whether or not a type is a sampler
290     */
is_samplerglsl_type291    bool is_sampler() const
292    {
293       return base_type == GLSL_TYPE_SAMPLER;
294    }
295 
296    /**
297     * Query whether or not a type is an array
298     */
is_arrayglsl_type299    bool is_array() const
300    {
301       return base_type == GLSL_TYPE_ARRAY;
302    }
303 
304    /**
305     * Query whether or not a type is a record
306     */
is_recordglsl_type307    bool is_record() const
308    {
309       return base_type == GLSL_TYPE_STRUCT;
310    }
311 
312    /**
313     * Query whether or not a type is the void type singleton.
314     */
is_voidglsl_type315    bool is_void() const
316    {
317       return base_type == GLSL_TYPE_VOID;
318    }
319 
320    /**
321     * Query whether or not a type is the error type singleton.
322     */
is_errorglsl_type323    bool is_error() const
324    {
325       return base_type == GLSL_TYPE_ERROR;
326    }
327 
328    /**
329     * Query the full type of a matrix row
330     *
331     * \return
332     * If the type is not a matrix, \c glsl_type::error_type is returned.
333     * Otherwise a type matching the rows of the matrix is returned.
334     */
row_typeglsl_type335    const glsl_type *row_type() const
336    {
337       return is_matrix()
338 	 ? get_instance(base_type, matrix_columns, 1)
339 	 : error_type;
340    }
341 
342    /**
343     * Query the full type of a matrix column
344     *
345     * \return
346     * If the type is not a matrix, \c glsl_type::error_type is returned.
347     * Otherwise a type matching the columns of the matrix is returned.
348     */
column_typeglsl_type349    const glsl_type *column_type() const
350    {
351       return is_matrix()
352 	 ? get_instance(base_type, vector_elements, 1)
353 	 : error_type;
354    }
355 
356 
357    /**
358     * Get the type of a structure field
359     *
360     * \return
361     * Pointer to the type of the named field.  If the type is not a structure
362     * or the named field does not exist, \c glsl_type::error_type is returned.
363     */
364    const glsl_type *field_type(const char *name) const;
365 
366 
367    /**
368     * Get the location of a filed within a record type
369     */
370    int field_index(const char *name) const;
371 
372 
373    /**
374     * Query the number of elements in an array type
375     *
376     * \return
377     * The number of elements in the array for array types or -1 for non-array
378     * types.  If the number of elements in the array has not yet been declared,
379     * zero is returned.
380     */
array_sizeglsl_type381    int array_size() const
382    {
383       return is_array() ? length : -1;
384    }
385 
386 private:
387    /**
388     * hieralloc context for all glsl_type allocations
389     *
390     * Set on the first call to \c glsl_type::new.
391     */
392    static void *mem_ctx;
393 
394    void init_hieralloc_type_ctx(void);
395 
396    /** Constructor for vector and matrix types */
397    glsl_type(GLenum gl_type,
398 	     glsl_base_type base_type, unsigned vector_elements,
399 	     unsigned matrix_columns, const char *name);
400 
401    /** Constructor for sampler types */
402    glsl_type(GLenum gl_type,
403 	     enum glsl_sampler_dim dim, bool shadow, bool array,
404 	     unsigned type, const char *name);
405 
406    /** Constructor for record types */
407    glsl_type(const glsl_struct_field *fields, unsigned num_fields,
408 	     const char *name);
409 
410    /** Constructor for array types */
411    glsl_type(const glsl_type *array, unsigned length);
412 
413    /** Hash table containing the known array types. */
414    static struct hash_table *array_types;
415 
416    /** Hash table containing the known record types. */
417    static struct hash_table *record_types;
418 
419    static int record_key_compare(const void *a, const void *b);
420    static unsigned record_key_hash(const void *key);
421 
422    /**
423     * \name Pointers to various type singletons
424     */
425    /*@{*/
426    static const glsl_type _error_type;
427    static const glsl_type void_type;
428    static const glsl_type builtin_core_types[];
429    static const glsl_type builtin_structure_types[];
430    static const glsl_type builtin_110_deprecated_structure_types[];
431    static const glsl_type builtin_110_types[];
432    static const glsl_type builtin_120_types[];
433    static const glsl_type builtin_130_types[];
434    static const glsl_type builtin_ARB_texture_rectangle_types[];
435    static const glsl_type builtin_EXT_texture_array_types[];
436    static const glsl_type builtin_EXT_texture_buffer_object_types[];
437    /*@}*/
438 
439    /**
440     * \name Methods to populate a symbol table with built-in types.
441     *
442     * \internal
443     * This is one of the truely annoying things about C++.  Methods that are
444     * completely internal and private to a type still have to be advertised to
445     * the world in a public header file.
446     */
447    /*@{*/
448    static void generate_100ES_types(glsl_symbol_table *);
449    static void generate_110_types(glsl_symbol_table *);
450    static void generate_120_types(glsl_symbol_table *);
451    static void generate_130_types(glsl_symbol_table *);
452    static void generate_ARB_texture_rectangle_types(glsl_symbol_table *, bool);
453    static void generate_EXT_texture_array_types(glsl_symbol_table *, bool);
454    /*@}*/
455 
456    /**
457     * \name Friend functions.
458     *
459     * These functions are friends because they must have C linkage and the
460     * need to call various private methods or access various private static
461     * data.
462     */
463    /*@{*/
464    friend void _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *);
465    friend void _mesa_glsl_release_types(void);
466    /*@}*/
467 };
468 
469 struct glsl_struct_field {
470    const struct glsl_type *type;
471    const char *name;
472 };
473 
474 #endif /* GLSL_TYPES_H */
475