Home | History | Annotate | Download | only in glsl
      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 "compiler/glsl_types.h"
     38 #include "glsl_parser_extras.h"
     39 #include "util/macros.h"
     40 
     41 /**
     42  * Declarations of type flyweights (glsl_type::_foo_type) and
     43  * convenience pointers (glsl_type::foo_type).
     44  * @{
     45  */
     46 #define DECL_TYPE(NAME, ...)
     47 
     48 #define STRUCT_TYPE(NAME)                                       \
     49    const glsl_type glsl_type::_struct_##NAME##_type =           \
     50       glsl_type(NAME##_fields, ARRAY_SIZE(NAME##_fields), #NAME); \
     51    const glsl_type *const glsl_type::struct_##NAME##_type =     \
     52       &glsl_type::_struct_##NAME##_type;
     53 
     54 static const struct glsl_struct_field gl_DepthRangeParameters_fields[] = {
     55    glsl_struct_field(glsl_type::float_type, "near"),
     56    glsl_struct_field(glsl_type::float_type, "far"),
     57    glsl_struct_field(glsl_type::float_type, "diff"),
     58 };
     59 
     60 static const struct glsl_struct_field gl_PointParameters_fields[] = {
     61    glsl_struct_field(glsl_type::float_type, "size"),
     62    glsl_struct_field(glsl_type::float_type, "sizeMin"),
     63    glsl_struct_field(glsl_type::float_type, "sizeMax"),
     64    glsl_struct_field(glsl_type::float_type, "fadeThresholdSize"),
     65    glsl_struct_field(glsl_type::float_type, "distanceConstantAttenuation"),
     66    glsl_struct_field(glsl_type::float_type, "distanceLinearAttenuation"),
     67    glsl_struct_field(glsl_type::float_type, "distanceQuadraticAttenuation"),
     68 };
     69 
     70 static const struct glsl_struct_field gl_MaterialParameters_fields[] = {
     71    glsl_struct_field(glsl_type::vec4_type, "emission"),
     72    glsl_struct_field(glsl_type::vec4_type, "ambient"),
     73    glsl_struct_field(glsl_type::vec4_type, "diffuse"),
     74    glsl_struct_field(glsl_type::vec4_type, "specular"),
     75    glsl_struct_field(glsl_type::float_type, "shininess"),
     76 };
     77 
     78 static const struct glsl_struct_field gl_LightSourceParameters_fields[] = {
     79    glsl_struct_field(glsl_type::vec4_type, "ambient"),
     80    glsl_struct_field(glsl_type::vec4_type, "diffuse"),
     81    glsl_struct_field(glsl_type::vec4_type, "specular"),
     82    glsl_struct_field(glsl_type::vec4_type, "position"),
     83    glsl_struct_field(glsl_type::vec4_type, "halfVector"),
     84    glsl_struct_field(glsl_type::vec3_type, "spotDirection"),
     85    glsl_struct_field(glsl_type::float_type, "spotExponent"),
     86    glsl_struct_field(glsl_type::float_type, "spotCutoff"),
     87    glsl_struct_field(glsl_type::float_type, "spotCosCutoff"),
     88    glsl_struct_field(glsl_type::float_type, "constantAttenuation"),
     89    glsl_struct_field(glsl_type::float_type, "linearAttenuation"),
     90    glsl_struct_field(glsl_type::float_type, "quadraticAttenuation"),
     91 };
     92 
     93 static const struct glsl_struct_field gl_LightModelParameters_fields[] = {
     94    glsl_struct_field(glsl_type::vec4_type, "ambient"),
     95 };
     96 
     97 static const struct glsl_struct_field gl_LightModelProducts_fields[] = {
     98    glsl_struct_field(glsl_type::vec4_type, "sceneColor"),
     99 };
    100 
    101 static const struct glsl_struct_field gl_LightProducts_fields[] = {
    102    glsl_struct_field(glsl_type::vec4_type, "ambient"),
    103    glsl_struct_field(glsl_type::vec4_type, "diffuse"),
    104    glsl_struct_field(glsl_type::vec4_type, "specular"),
    105 };
    106 
    107 static const struct glsl_struct_field gl_FogParameters_fields[] = {
    108    glsl_struct_field(glsl_type::vec4_type, "color"),
    109    glsl_struct_field(glsl_type::float_type, "density"),
    110    glsl_struct_field(glsl_type::float_type, "start"),
    111    glsl_struct_field(glsl_type::float_type, "end"),
    112    glsl_struct_field(glsl_type::float_type, "scale"),
    113 };
    114 
    115 #include "compiler/builtin_type_macros.h"
    116 /** @} */
    117 
    118 /**
    119  * Code to populate a symbol table with the built-in types available in a
    120  * particular shading language version.  The table below contains tags every
    121  * type with the GLSL/GLSL ES versions where it was introduced.
    122  *
    123  * @{
    124  */
    125 #define T(TYPE, MIN_GL, MIN_ES) \
    126    { glsl_type::TYPE##_type, MIN_GL, MIN_ES },
    127 
    128 static const struct builtin_type_versions {
    129    const glsl_type *const type;
    130    int min_gl;
    131    int min_es;
    132 } builtin_type_versions[] = {
    133    T(void,                            110, 100)
    134    T(bool,                            110, 100)
    135    T(bvec2,                           110, 100)
    136    T(bvec3,                           110, 100)
    137    T(bvec4,                           110, 100)
    138    T(int,                             110, 100)
    139    T(ivec2,                           110, 100)
    140    T(ivec3,                           110, 100)
    141    T(ivec4,                           110, 100)
    142    T(uint,                            130, 300)
    143    T(uvec2,                           130, 300)
    144    T(uvec3,                           130, 300)
    145    T(uvec4,                           130, 300)
    146    T(float,                           110, 100)
    147    T(vec2,                            110, 100)
    148    T(vec3,                            110, 100)
    149    T(vec4,                            110, 100)
    150    T(mat2,                            110, 100)
    151    T(mat3,                            110, 100)
    152    T(mat4,                            110, 100)
    153    T(mat2x3,                          120, 300)
    154    T(mat2x4,                          120, 300)
    155    T(mat3x2,                          120, 300)
    156    T(mat3x4,                          120, 300)
    157    T(mat4x2,                          120, 300)
    158    T(mat4x3,                          120, 300)
    159 
    160    T(double,                          400, 999)
    161    T(dvec2,                           400, 999)
    162    T(dvec3,                           400, 999)
    163    T(dvec4,                           400, 999)
    164    T(dmat2,                           400, 999)
    165    T(dmat3,                           400, 999)
    166    T(dmat4,                           400, 999)
    167    T(dmat2x3,                         400, 999)
    168    T(dmat2x4,                         400, 999)
    169    T(dmat3x2,                         400, 999)
    170    T(dmat3x4,                         400, 999)
    171    T(dmat4x2,                         400, 999)
    172    T(dmat4x3,                         400, 999)
    173 
    174    T(sampler1D,                       110, 999)
    175    T(sampler2D,                       110, 100)
    176    T(sampler3D,                       110, 300)
    177    T(samplerCube,                     110, 100)
    178    T(sampler1DArray,                  130, 999)
    179    T(sampler2DArray,                  130, 300)
    180    T(samplerCubeArray,                400, 320)
    181    T(sampler2DRect,                   140, 999)
    182    T(samplerBuffer,                   140, 320)
    183    T(sampler2DMS,                     150, 310)
    184    T(sampler2DMSArray,                150, 320)
    185 
    186    T(isampler1D,                      130, 999)
    187    T(isampler2D,                      130, 300)
    188    T(isampler3D,                      130, 300)
    189    T(isamplerCube,                    130, 300)
    190    T(isampler1DArray,                 130, 999)
    191    T(isampler2DArray,                 130, 300)
    192    T(isamplerCubeArray,               400, 320)
    193    T(isampler2DRect,                  140, 999)
    194    T(isamplerBuffer,                  140, 320)
    195    T(isampler2DMS,                    150, 310)
    196    T(isampler2DMSArray,               150, 320)
    197 
    198    T(usampler1D,                      130, 999)
    199    T(usampler2D,                      130, 300)
    200    T(usampler3D,                      130, 300)
    201    T(usamplerCube,                    130, 300)
    202    T(usampler1DArray,                 130, 999)
    203    T(usampler2DArray,                 130, 300)
    204    T(usamplerCubeArray,               400, 320)
    205    T(usampler2DRect,                  140, 999)
    206    T(usamplerBuffer,                  140, 320)
    207    T(usampler2DMS,                    150, 310)
    208    T(usampler2DMSArray,               150, 320)
    209 
    210    T(sampler1DShadow,                 110, 999)
    211    T(sampler2DShadow,                 110, 300)
    212    T(samplerCubeShadow,               130, 300)
    213    T(sampler1DArrayShadow,            130, 999)
    214    T(sampler2DArrayShadow,            130, 300)
    215    T(samplerCubeArrayShadow,          400, 320)
    216    T(sampler2DRectShadow,             140, 999)
    217 
    218    T(struct_gl_DepthRangeParameters,  110, 100)
    219 
    220    T(image1D,                         420, 999)
    221    T(image2D,                         420, 310)
    222    T(image3D,                         420, 310)
    223    T(image2DRect,                     420, 999)
    224    T(imageCube,                       420, 310)
    225    T(imageBuffer,                     420, 320)
    226    T(image1DArray,                    420, 999)
    227    T(image2DArray,                    420, 310)
    228    T(imageCubeArray,                  420, 320)
    229    T(image2DMS,                       420, 999)
    230    T(image2DMSArray,                  420, 999)
    231    T(iimage1D,                        420, 999)
    232    T(iimage2D,                        420, 310)
    233    T(iimage3D,                        420, 310)
    234    T(iimage2DRect,                    420, 999)
    235    T(iimageCube,                      420, 310)
    236    T(iimageBuffer,                    420, 320)
    237    T(iimage1DArray,                   420, 999)
    238    T(iimage2DArray,                   420, 310)
    239    T(iimageCubeArray,                 420, 320)
    240    T(iimage2DMS,                      420, 999)
    241    T(iimage2DMSArray,                 420, 999)
    242    T(uimage1D,                        420, 999)
    243    T(uimage2D,                        420, 310)
    244    T(uimage3D,                        420, 310)
    245    T(uimage2DRect,                    420, 999)
    246    T(uimageCube,                      420, 310)
    247    T(uimageBuffer,                    420, 320)
    248    T(uimage1DArray,                   420, 999)
    249    T(uimage2DArray,                   420, 310)
    250    T(uimageCubeArray,                 420, 320)
    251    T(uimage2DMS,                      420, 999)
    252    T(uimage2DMSArray,                 420, 999)
    253 
    254    T(atomic_uint,                     420, 310)
    255 };
    256 
    257 static const glsl_type *const deprecated_types[] = {
    258    glsl_type::struct_gl_PointParameters_type,
    259    glsl_type::struct_gl_MaterialParameters_type,
    260    glsl_type::struct_gl_LightSourceParameters_type,
    261    glsl_type::struct_gl_LightModelParameters_type,
    262    glsl_type::struct_gl_LightModelProducts_type,
    263    glsl_type::struct_gl_LightProducts_type,
    264    glsl_type::struct_gl_FogParameters_type,
    265 };
    266 
    267 static inline void
    268 add_type(glsl_symbol_table *symbols, const glsl_type *const type)
    269 {
    270    symbols->add_type(type->name, type);
    271 }
    272 
    273 /**
    274  * Populate the symbol table with available built-in types.
    275  */
    276 void
    277 _mesa_glsl_initialize_types(struct _mesa_glsl_parse_state *state)
    278 {
    279    struct glsl_symbol_table *symbols = state->symbols;
    280 
    281    for (unsigned i = 0; i < ARRAY_SIZE(builtin_type_versions); i++) {
    282       const struct builtin_type_versions *const t = &builtin_type_versions[i];
    283       if (state->is_version(t->min_gl, t->min_es)) {
    284          add_type(symbols, t->type);
    285       }
    286    }
    287 
    288    /* Add deprecated structure types.  While these were deprecated in 1.30,
    289     * they're still present.  We've removed them in 1.40+ (OpenGL 3.1+).
    290     */
    291    if (!state->es_shader && state->language_version < 140) {
    292       for (unsigned i = 0; i < ARRAY_SIZE(deprecated_types); i++) {
    293          add_type(symbols, deprecated_types[i]);
    294       }
    295    }
    296 
    297    /* Add types for enabled extensions.  They may have already been added
    298     * by the version-based loop, but attempting to add them a second time
    299     * is harmless.
    300     */
    301    if (state->ARB_texture_cube_map_array_enable ||
    302        state->EXT_texture_cube_map_array_enable ||
    303        state->OES_texture_cube_map_array_enable) {
    304       add_type(symbols, glsl_type::samplerCubeArray_type);
    305       add_type(symbols, glsl_type::samplerCubeArrayShadow_type);
    306       add_type(symbols, glsl_type::isamplerCubeArray_type);
    307       add_type(symbols, glsl_type::usamplerCubeArray_type);
    308    }
    309 
    310    if (state->ARB_texture_multisample_enable) {
    311       add_type(symbols, glsl_type::sampler2DMS_type);
    312       add_type(symbols, glsl_type::isampler2DMS_type);
    313       add_type(symbols, glsl_type::usampler2DMS_type);
    314    }
    315    if (state->ARB_texture_multisample_enable ||
    316        state->OES_texture_storage_multisample_2d_array_enable) {
    317       add_type(symbols, glsl_type::sampler2DMSArray_type);
    318       add_type(symbols, glsl_type::isampler2DMSArray_type);
    319       add_type(symbols, glsl_type::usampler2DMSArray_type);
    320    }
    321 
    322    if (state->ARB_texture_rectangle_enable) {
    323       add_type(symbols, glsl_type::sampler2DRect_type);
    324       add_type(symbols, glsl_type::sampler2DRectShadow_type);
    325    }
    326 
    327    if (state->EXT_texture_array_enable) {
    328       add_type(symbols, glsl_type::sampler1DArray_type);
    329       add_type(symbols, glsl_type::sampler2DArray_type);
    330       add_type(symbols, glsl_type::sampler1DArrayShadow_type);
    331       add_type(symbols, glsl_type::sampler2DArrayShadow_type);
    332    }
    333 
    334    if (state->OES_EGL_image_external_enable) {
    335       add_type(symbols, glsl_type::samplerExternalOES_type);
    336    }
    337 
    338    if (state->OES_texture_3D_enable) {
    339       add_type(symbols, glsl_type::sampler3D_type);
    340    }
    341 
    342    if (state->ARB_shader_image_load_store_enable ||
    343        state->EXT_texture_cube_map_array_enable ||
    344        state->OES_texture_cube_map_array_enable) {
    345       add_type(symbols, glsl_type::imageCubeArray_type);
    346       add_type(symbols, glsl_type::iimageCubeArray_type);
    347       add_type(symbols, glsl_type::uimageCubeArray_type);
    348    }
    349 
    350    if (state->ARB_shader_image_load_store_enable) {
    351       add_type(symbols, glsl_type::image1D_type);
    352       add_type(symbols, glsl_type::image2D_type);
    353       add_type(symbols, glsl_type::image3D_type);
    354       add_type(symbols, glsl_type::image2DRect_type);
    355       add_type(symbols, glsl_type::imageCube_type);
    356       add_type(symbols, glsl_type::imageBuffer_type);
    357       add_type(symbols, glsl_type::image1DArray_type);
    358       add_type(symbols, glsl_type::image2DArray_type);
    359       add_type(symbols, glsl_type::image2DMS_type);
    360       add_type(symbols, glsl_type::image2DMSArray_type);
    361       add_type(symbols, glsl_type::iimage1D_type);
    362       add_type(symbols, glsl_type::iimage2D_type);
    363       add_type(symbols, glsl_type::iimage3D_type);
    364       add_type(symbols, glsl_type::iimage2DRect_type);
    365       add_type(symbols, glsl_type::iimageCube_type);
    366       add_type(symbols, glsl_type::iimageBuffer_type);
    367       add_type(symbols, glsl_type::iimage1DArray_type);
    368       add_type(symbols, glsl_type::iimage2DArray_type);
    369       add_type(symbols, glsl_type::iimage2DMS_type);
    370       add_type(symbols, glsl_type::iimage2DMSArray_type);
    371       add_type(symbols, glsl_type::uimage1D_type);
    372       add_type(symbols, glsl_type::uimage2D_type);
    373       add_type(symbols, glsl_type::uimage3D_type);
    374       add_type(symbols, glsl_type::uimage2DRect_type);
    375       add_type(symbols, glsl_type::uimageCube_type);
    376       add_type(symbols, glsl_type::uimageBuffer_type);
    377       add_type(symbols, glsl_type::uimage1DArray_type);
    378       add_type(symbols, glsl_type::uimage2DArray_type);
    379       add_type(symbols, glsl_type::uimage2DMS_type);
    380       add_type(symbols, glsl_type::uimage2DMSArray_type);
    381    }
    382 
    383    if (state->EXT_texture_buffer_enable || state->OES_texture_buffer_enable) {
    384       add_type(symbols, glsl_type::samplerBuffer_type);
    385       add_type(symbols, glsl_type::isamplerBuffer_type);
    386       add_type(symbols, glsl_type::usamplerBuffer_type);
    387 
    388       add_type(symbols, glsl_type::imageBuffer_type);
    389       add_type(symbols, glsl_type::iimageBuffer_type);
    390       add_type(symbols, glsl_type::uimageBuffer_type);
    391    }
    392 
    393    if (state->has_atomic_counters()) {
    394       add_type(symbols, glsl_type::atomic_uint_type);
    395    }
    396 
    397    if (state->ARB_gpu_shader_fp64_enable) {
    398       add_type(symbols, glsl_type::double_type);
    399       add_type(symbols, glsl_type::dvec2_type);
    400       add_type(symbols, glsl_type::dvec3_type);
    401       add_type(symbols, glsl_type::dvec4_type);
    402       add_type(symbols, glsl_type::dmat2_type);
    403       add_type(symbols, glsl_type::dmat3_type);
    404       add_type(symbols, glsl_type::dmat4_type);
    405       add_type(symbols, glsl_type::dmat2x3_type);
    406       add_type(symbols, glsl_type::dmat2x4_type);
    407       add_type(symbols, glsl_type::dmat3x2_type);
    408       add_type(symbols, glsl_type::dmat3x4_type);
    409       add_type(symbols, glsl_type::dmat4x2_type);
    410       add_type(symbols, glsl_type::dmat4x3_type);
    411    }
    412 }
    413 /** @} */
    414