Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
4358 Serge 1
/*
2
 * Copyright © 2013 Intel Corporation
3
 *
4
 * Permission is hereby granted, free of charge, to any person obtaining a
5
 * copy of this software and associated documentation files (the "Software"),
6
 * to deal in the Software without restriction, including without limitation
7
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8
 * and/or sell copies of the Software, and to permit persons to whom the
9
 * Software is furnished to do so, subject to the following conditions:
10
 *
11
 * The above copyright notice and this permission notice (including the next
12
 * paragraph) shall be included in all copies or substantial portions of the
13
 * Software.
14
 *
15
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21
 * DEALINGS IN THE SOFTWARE.
22
 */
23
 
24
/**
25
 * \file builtin_types.cpp
26
 *
27
 * The glsl_type class has static members to represent all the built-in types
28
 * (such as the glsl_type::_float_type flyweight) as well as convenience pointer
29
 * accessors (such as glsl_type::float_type).  Those global variables are
30
 * declared and initialized in this file.
31
 *
32
 * This also contains _mesa_glsl_initialize_types(), a function which populates
33
 * a symbol table with the available built-in types for a particular language
34
 * version and set of enabled extensions.
35
 */
36
 
37
#include "glsl_types.h"
38
#include "glsl_parser_extras.h"
39
 
40
/**
41
 * Declarations of type flyweights (glsl_type::_foo_type) and
42
 * convenience pointers (glsl_type::foo_type).
43
 * @{
44
 */
45
#define DECL_TYPE(NAME, ...)                                    \
46
   const glsl_type glsl_type::_##NAME##_type = glsl_type(__VA_ARGS__, #NAME); \
47
   const glsl_type *const glsl_type::NAME##_type = &glsl_type::_##NAME##_type;
48
 
49
#define STRUCT_TYPE(NAME)                                       \
50
   const glsl_type glsl_type::_struct_##NAME##_type =           \
51
      glsl_type(NAME##_fields, Elements(NAME##_fields), #NAME); \
52
   const glsl_type *const glsl_type::struct_##NAME##_type =     \
53
      &glsl_type::_struct_##NAME##_type;
54
 
55
static const struct glsl_struct_field gl_DepthRangeParameters_fields[] = {
56
   { glsl_type::float_type, "near", false },
57
   { glsl_type::float_type, "far",  false },
58
   { glsl_type::float_type, "diff", false },
59
};
60
 
61
static const struct glsl_struct_field gl_PointParameters_fields[] = {
62
   { glsl_type::float_type, "size", false },
63
   { glsl_type::float_type, "sizeMin", false },
64
   { glsl_type::float_type, "sizeMax", false },
65
   { glsl_type::float_type, "fadeThresholdSize", false },
66
   { glsl_type::float_type, "distanceConstantAttenuation", false },
67
   { glsl_type::float_type, "distanceLinearAttenuation", false },
68
   { glsl_type::float_type, "distanceQuadraticAttenuation", false },
69
};
70
 
71
static const struct glsl_struct_field gl_MaterialParameters_fields[] = {
72
   { glsl_type::vec4_type, "emission", false },
73
   { glsl_type::vec4_type, "ambient", false },
74
   { glsl_type::vec4_type, "diffuse", false },
75
   { glsl_type::vec4_type, "specular", false },
76
   { glsl_type::float_type, "shininess", false },
77
};
78
 
79
static const struct glsl_struct_field gl_LightSourceParameters_fields[] = {
80
   { glsl_type::vec4_type, "ambient", false },
81
   { glsl_type::vec4_type, "diffuse", false },
82
   { glsl_type::vec4_type, "specular", false },
83
   { glsl_type::vec4_type, "position", false },
84
   { glsl_type::vec4_type, "halfVector", false },
85
   { glsl_type::vec3_type, "spotDirection", false },
86
   { glsl_type::float_type, "spotExponent", false },
87
   { glsl_type::float_type, "spotCutoff", false },
88
   { glsl_type::float_type, "spotCosCutoff", false },
89
   { glsl_type::float_type, "constantAttenuation", false },
90
   { glsl_type::float_type, "linearAttenuation", false },
91
   { glsl_type::float_type, "quadraticAttenuation", false },
92
};
93
 
94
static const struct glsl_struct_field gl_LightModelParameters_fields[] = {
95
   { glsl_type::vec4_type, "ambient", false },
96
};
97
 
98
static const struct glsl_struct_field gl_LightModelProducts_fields[] = {
99
   { glsl_type::vec4_type, "sceneColor", false },
100
};
101
 
102
static const struct glsl_struct_field gl_LightProducts_fields[] = {
103
   { glsl_type::vec4_type, "ambient", false },
104
   { glsl_type::vec4_type, "diffuse", false },
105
   { glsl_type::vec4_type, "specular", false },
106
};
107
 
108
static const struct glsl_struct_field gl_FogParameters_fields[] = {
109
   { glsl_type::vec4_type, "color", false },
110
   { glsl_type::float_type, "density", false },
111
   { glsl_type::float_type, "start", false },
112
   { glsl_type::float_type, "end", false },
113
   { glsl_type::float_type, "scale", false },
114
};
115
 
116
#include "builtin_type_macros.h"
117
/** @} */
118
 
119
/**
120
 * Code to populate a symbol table with the built-in types available in a
121
 * particular shading language version.  The table below contains tags every
122
 * type with the GLSL/GLSL ES versions where it was introduced.
123
 *
124
 * @{
125
 */
126
#define T(TYPE, MIN_GL, MIN_ES) \
127
   { glsl_type::TYPE##_type, MIN_GL, MIN_ES },
128
 
129
const static struct builtin_type_versions {
130
   const glsl_type *const type;
131
   int min_gl;
132
   int min_es;
133
} builtin_type_versions[] = {
134
   T(void,                            110, 100)
135
   T(bool,                            110, 100)
136
   T(bvec2,                           110, 100)
137
   T(bvec3,                           110, 100)
138
   T(bvec4,                           110, 100)
139
   T(int,                             110, 100)
140
   T(ivec2,                           110, 100)
141
   T(ivec3,                           110, 100)
142
   T(ivec4,                           110, 100)
143
   T(uint,                            130, 300)
144
   T(uvec2,                           130, 300)
145
   T(uvec3,                           130, 300)
146
   T(uvec4,                           130, 300)
147
   T(float,                           110, 100)
148
   T(vec2,                            110, 100)
149
   T(vec3,                            110, 100)
150
   T(vec4,                            110, 100)
151
   T(mat2,                            110, 100)
152
   T(mat3,                            110, 100)
153
   T(mat4,                            110, 100)
154
   T(mat2x3,                          120, 300)
155
   T(mat2x4,                          120, 300)
156
   T(mat3x2,                          120, 300)
157
   T(mat3x4,                          120, 300)
158
   T(mat4x2,                          120, 300)
159
   T(mat4x3,                          120, 300)
160
 
161
   T(sampler1D,                       110, 999)
162
   T(sampler2D,                       110, 100)
163
   T(sampler3D,                       110, 300)
164
   T(samplerCube,                     110, 100)
165
   T(sampler1DArray,                  130, 999)
166
   T(sampler2DArray,                  130, 300)
167
   T(samplerCubeArray,                400, 999)
168
   T(sampler2DRect,                   140, 999)
169
   T(samplerBuffer,                   140, 999)
170
   T(sampler2DMS,                     150, 999)
171
   T(sampler2DMSArray,                150, 999)
172
 
173
   T(isampler1D,                      130, 999)
174
   T(isampler2D,                      130, 300)
175
   T(isampler3D,                      130, 300)
176
   T(isamplerCube,                    130, 300)
177
   T(isampler1DArray,                 130, 999)
178
   T(isampler2DArray,                 130, 300)
179
   T(isamplerCubeArray,               400, 999)
180
   T(isampler2DRect,                  140, 999)
181
   T(isamplerBuffer,                  140, 999)
182
   T(isampler2DMS,                    150, 999)
183
   T(isampler2DMSArray,               150, 999)
184
 
185
   T(usampler1D,                      130, 999)
186
   T(usampler2D,                      130, 300)
187
   T(usampler3D,                      130, 300)
188
   T(usamplerCube,                    130, 300)
189
   T(usampler1DArray,                 130, 999)
190
   T(usampler2DArray,                 130, 300)
191
   T(usamplerCubeArray,               400, 999)
192
   T(usampler2DRect,                  140, 999)
193
   T(usamplerBuffer,                  140, 999)
194
   T(usampler2DMS,                    150, 999)
195
   T(usampler2DMSArray,               150, 999)
196
 
197
   T(sampler1DShadow,                 110, 999)
198
   T(sampler2DShadow,                 110, 300)
199
   T(samplerCubeShadow,               130, 300)
200
   T(sampler1DArrayShadow,            130, 999)
201
   T(sampler2DArrayShadow,            130, 300)
202
   T(samplerCubeArrayShadow,          400, 999)
203
   T(sampler2DRectShadow,             140, 999)
204
 
205
   T(struct_gl_DepthRangeParameters,  110, 100)
206
};
207
 
208
const glsl_type *const deprecated_types[] = {
209
   glsl_type::struct_gl_PointParameters_type,
210
   glsl_type::struct_gl_MaterialParameters_type,
211
   glsl_type::struct_gl_LightSourceParameters_type,
212
   glsl_type::struct_gl_LightModelParameters_type,
213
   glsl_type::struct_gl_LightModelProducts_type,
214
   glsl_type::struct_gl_LightProducts_type,
215
   glsl_type::struct_gl_FogParameters_type,
216
};
217
 
218
static inline void
219
add_type(glsl_symbol_table *symbols, const glsl_type *const type)
220
{
221
   symbols->add_type(type->name, type);
222
}
223
 
224
/**
225
 * Populate the symbol table with available built-in types.
226
 */
227
void
228
_mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state)
229
{
230
   struct glsl_symbol_table *symbols = state->symbols;
231
 
232
   for (unsigned i = 0; i < Elements(builtin_type_versions); i++) {
233
      const struct builtin_type_versions *const t = &builtin_type_versions[i];
234
      if (state->is_version(t->min_gl, t->min_es)) {
235
         add_type(symbols, t->type);
236
      }
237
   }
238
 
239
   /* Add deprecated structure types.  While these were deprecated in 1.30,
240
    * they're still present.  We've removed them in 1.40+ (OpenGL 3.1+).
241
    */
242
   if (!state->es_shader && state->language_version < 140) {
243
      for (unsigned i = 0; i < Elements(deprecated_types); i++) {
244
         add_type(symbols, deprecated_types[i]);
245
      }
246
   }
247
 
248
   /* Add types for enabled extensions.  They may have already been added
249
    * by the version-based loop, but attempting to add them a second time
250
    * is harmless.
251
    */
252
   if (state->ARB_texture_cube_map_array_enable) {
253
      add_type(symbols, glsl_type::samplerCubeArray_type);
254
      add_type(symbols, glsl_type::samplerCubeArrayShadow_type);
255
      add_type(symbols, glsl_type::isamplerCubeArray_type);
256
      add_type(symbols, glsl_type::usamplerCubeArray_type);
257
   }
258
 
259
   if (state->ARB_texture_multisample_enable) {
260
      add_type(symbols, glsl_type::sampler2DMS_type);
261
      add_type(symbols, glsl_type::isampler2DMS_type);
262
      add_type(symbols, glsl_type::usampler2DMS_type);
263
      add_type(symbols, glsl_type::sampler2DMSArray_type);
264
      add_type(symbols, glsl_type::isampler2DMSArray_type);
265
      add_type(symbols, glsl_type::usampler2DMSArray_type);
266
   }
267
 
268
   if (state->ARB_texture_rectangle_enable) {
269
      add_type(symbols, glsl_type::sampler2DRect_type);
270
      add_type(symbols, glsl_type::sampler2DRectShadow_type);
271
   }
272
 
273
   if (state->EXT_texture_array_enable) {
274
      add_type(symbols, glsl_type::sampler1DArray_type);
275
      add_type(symbols, glsl_type::sampler2DArray_type);
276
      add_type(symbols, glsl_type::sampler1DArrayShadow_type);
277
      add_type(symbols, glsl_type::sampler2DArrayShadow_type);
278
   }
279
 
280
   if (state->OES_EGL_image_external_enable) {
281
      add_type(symbols, glsl_type::samplerExternalOES_type);
282
   }
283
 
284
   if (state->OES_texture_3D_enable) {
285
      add_type(symbols, glsl_type::sampler3D_type);
286
   }
287
}
288
/** @} */