Subversion Repositories Kolibri OS

Rev

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

  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. /** @} */
  289.