Home | History | Annotate | Download | only in glsl
      1 /*
      2  * Copyright  2010 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 #pragma once
     25 #ifndef GLSL_PARSER_EXTRAS_H
     26 #define GLSL_PARSER_EXTRAS_H
     27 
     28 /*
     29  * Most of the definitions here only apply to C++
     30  */
     31 #ifdef __cplusplus
     32 
     33 
     34 #include <stdlib.h>
     35 #include "glsl_symbol_table.h"
     36 
     37 struct gl_context;
     38 
     39 struct glsl_switch_state {
     40    /** Temporary variables needed for switch statement. */
     41    ir_variable *test_var;
     42    ir_variable *is_fallthru_var;
     43    class ast_switch_statement *switch_nesting_ast;
     44 
     45    /** Used to detect if 'continue' was called inside a switch. */
     46    ir_variable *continue_inside;
     47 
     48    /** Used to set condition if 'default' label should be chosen. */
     49    ir_variable *run_default;
     50 
     51    /** Table of constant values already used in case labels */
     52    struct hash_table *labels_ht;
     53    class ast_case_label *previous_default;
     54 
     55    bool is_switch_innermost; // if switch stmt is closest to break, ...
     56 };
     57 
     58 const char *
     59 glsl_compute_version_string(void *mem_ctx, bool is_es, unsigned version);
     60 
     61 typedef struct YYLTYPE {
     62    int first_line;
     63    int first_column;
     64    int last_line;
     65    int last_column;
     66    unsigned source;
     67 } YYLTYPE;
     68 # define YYLTYPE_IS_DECLARED 1
     69 # define YYLTYPE_IS_TRIVIAL 1
     70 
     71 extern void _mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state,
     72                              const char *fmt, ...);
     73 
     74 
     75 struct _mesa_glsl_parse_state {
     76    _mesa_glsl_parse_state(struct gl_context *_ctx, gl_shader_stage stage,
     77                           void *mem_ctx);
     78 
     79    DECLARE_RZALLOC_CXX_OPERATORS(_mesa_glsl_parse_state);
     80 
     81    /**
     82     * Generate a string representing the GLSL version currently being compiled
     83     * (useful for error messages).
     84     */
     85    const char *get_version_string()
     86    {
     87       return glsl_compute_version_string(this, this->es_shader,
     88                                          this->language_version);
     89    }
     90 
     91    /**
     92     * Determine whether the current GLSL version is sufficiently high to
     93     * support a certain feature.
     94     *
     95     * \param required_glsl_version is the desktop GLSL version that is
     96     * required to support the feature, or 0 if no version of desktop GLSL
     97     * supports the feature.
     98     *
     99     * \param required_glsl_es_version is the GLSL ES version that is required
    100     * to support the feature, or 0 if no version of GLSL ES supports the
    101     * feature.
    102     */
    103    bool is_version(unsigned required_glsl_version,
    104                    unsigned required_glsl_es_version) const
    105    {
    106       unsigned required_version = this->es_shader ?
    107          required_glsl_es_version : required_glsl_version;
    108       unsigned this_version = this->forced_language_version
    109          ? this->forced_language_version : this->language_version;
    110       return required_version != 0
    111          && this_version >= required_version;
    112    }
    113 
    114    bool check_version(unsigned required_glsl_version,
    115                       unsigned required_glsl_es_version,
    116                       YYLTYPE *locp, const char *fmt, ...) PRINTFLIKE(5, 6);
    117 
    118    bool check_arrays_of_arrays_allowed(YYLTYPE *locp)
    119    {
    120       if (!(ARB_arrays_of_arrays_enable || is_version(430, 310))) {
    121          const char *const requirement = this->es_shader
    122             ? "GLSL ES 3.10"
    123             : "GL_ARB_arrays_of_arrays or GLSL 4.30";
    124          _mesa_glsl_error(locp, this,
    125                           "%s required for defining arrays of arrays.",
    126                           requirement);
    127          return false;
    128       }
    129       return true;
    130    }
    131 
    132    bool check_precision_qualifiers_allowed(YYLTYPE *locp)
    133    {
    134       return check_version(130, 100, locp,
    135                            "precision qualifiers are forbidden");
    136    }
    137 
    138    bool check_bitwise_operations_allowed(YYLTYPE *locp)
    139    {
    140       return check_version(130, 300, locp, "bit-wise operations are forbidden");
    141    }
    142 
    143    bool check_explicit_attrib_stream_allowed(YYLTYPE *locp)
    144    {
    145       if (!this->has_explicit_attrib_stream()) {
    146          const char *const requirement = "GL_ARB_gpu_shader5 extension or GLSL 4.00";
    147 
    148          _mesa_glsl_error(locp, this, "explicit stream requires %s",
    149                           requirement);
    150          return false;
    151       }
    152 
    153       return true;
    154    }
    155 
    156    bool check_explicit_attrib_location_allowed(YYLTYPE *locp,
    157                                                const ir_variable *var)
    158    {
    159       if (!this->has_explicit_attrib_location()) {
    160          const char *const requirement = this->es_shader
    161             ? "GLSL ES 3.00"
    162             : "GL_ARB_explicit_attrib_location extension or GLSL 3.30";
    163 
    164          _mesa_glsl_error(locp, this, "%s explicit location requires %s",
    165                           mode_string(var), requirement);
    166          return false;
    167       }
    168 
    169       return true;
    170    }
    171 
    172    bool check_separate_shader_objects_allowed(YYLTYPE *locp,
    173                                               const ir_variable *var)
    174    {
    175       if (!this->has_separate_shader_objects()) {
    176          const char *const requirement = this->es_shader
    177             ? "GL_EXT_separate_shader_objects extension or GLSL ES 3.10"
    178             : "GL_ARB_separate_shader_objects extension or GLSL 4.20";
    179 
    180          _mesa_glsl_error(locp, this, "%s explicit location requires %s",
    181                           mode_string(var), requirement);
    182          return false;
    183       }
    184 
    185       return true;
    186    }
    187 
    188    bool check_explicit_uniform_location_allowed(YYLTYPE *locp,
    189                                                 const ir_variable *)
    190    {
    191       if (!this->has_explicit_attrib_location() ||
    192           !this->has_explicit_uniform_location()) {
    193          const char *const requirement = this->es_shader
    194             ? "GLSL ES 3.10"
    195             : "GL_ARB_explicit_uniform_location and either "
    196               "GL_ARB_explicit_attrib_location or GLSL 3.30.";
    197 
    198          _mesa_glsl_error(locp, this,
    199                           "uniform explicit location requires %s",
    200                           requirement);
    201          return false;
    202       }
    203 
    204       return true;
    205    }
    206 
    207    bool has_atomic_counters() const
    208    {
    209       return ARB_shader_atomic_counters_enable || is_version(420, 310);
    210    }
    211 
    212    bool has_enhanced_layouts() const
    213    {
    214       return ARB_enhanced_layouts_enable || is_version(440, 0);
    215    }
    216 
    217    bool has_explicit_attrib_stream() const
    218    {
    219       return ARB_gpu_shader5_enable || is_version(400, 0);
    220    }
    221 
    222    bool has_explicit_attrib_location() const
    223    {
    224       return ARB_explicit_attrib_location_enable || is_version(330, 300);
    225    }
    226 
    227    bool has_explicit_uniform_location() const
    228    {
    229       return ARB_explicit_uniform_location_enable || is_version(430, 310);
    230    }
    231 
    232    bool has_uniform_buffer_objects() const
    233    {
    234       return ARB_uniform_buffer_object_enable || is_version(140, 300);
    235    }
    236 
    237    bool has_shader_storage_buffer_objects() const
    238    {
    239       return ARB_shader_storage_buffer_object_enable || is_version(430, 310);
    240    }
    241 
    242    bool has_separate_shader_objects() const
    243    {
    244       return ARB_separate_shader_objects_enable || is_version(410, 310)
    245          || EXT_separate_shader_objects_enable;
    246    }
    247 
    248    bool has_double() const
    249    {
    250       return ARB_gpu_shader_fp64_enable || is_version(400, 0);
    251    }
    252 
    253    bool has_420pack() const
    254    {
    255       return ARB_shading_language_420pack_enable || is_version(420, 0);
    256    }
    257 
    258    bool has_420pack_or_es31() const
    259    {
    260       return ARB_shading_language_420pack_enable || is_version(420, 310);
    261    }
    262 
    263    bool has_compute_shader() const
    264    {
    265       return ARB_compute_shader_enable || is_version(430, 310);
    266    }
    267 
    268    bool has_shader_io_blocks() const
    269    {
    270       /* The OES_geometry_shader_specification says:
    271        *
    272        *    "If the OES_geometry_shader extension is enabled, the
    273        *     OES_shader_io_blocks extension is also implicitly enabled."
    274        *
    275        * The OES_tessellation_shader extension has similar wording.
    276        */
    277       return OES_shader_io_blocks_enable ||
    278              EXT_shader_io_blocks_enable ||
    279              OES_geometry_shader_enable ||
    280              EXT_geometry_shader_enable ||
    281              OES_tessellation_shader_enable ||
    282              EXT_tessellation_shader_enable ||
    283 
    284              is_version(150, 320);
    285    }
    286 
    287    bool has_geometry_shader() const
    288    {
    289       return OES_geometry_shader_enable || EXT_geometry_shader_enable ||
    290              is_version(150, 320);
    291    }
    292 
    293    bool has_tessellation_shader() const
    294    {
    295       return ARB_tessellation_shader_enable ||
    296              OES_tessellation_shader_enable ||
    297              EXT_tessellation_shader_enable ||
    298              is_version(400, 320);
    299    }
    300 
    301    bool has_clip_distance() const
    302    {
    303       return EXT_clip_cull_distance_enable || is_version(130, 0);
    304    }
    305 
    306    bool has_cull_distance() const
    307    {
    308       return EXT_clip_cull_distance_enable ||
    309              ARB_cull_distance_enable ||
    310              is_version(450, 0);
    311    }
    312 
    313    bool has_framebuffer_fetch() const
    314    {
    315       return EXT_shader_framebuffer_fetch_enable ||
    316              MESA_shader_framebuffer_fetch_enable ||
    317              MESA_shader_framebuffer_fetch_non_coherent_enable;
    318    }
    319 
    320    bool has_texture_cube_map_array() const
    321    {
    322       return ARB_texture_cube_map_array_enable ||
    323              EXT_texture_cube_map_array_enable ||
    324              OES_texture_cube_map_array_enable ||
    325              is_version(400, 320);
    326    }
    327 
    328    void process_version_directive(YYLTYPE *locp, int version,
    329                                   const char *ident);
    330 
    331    struct gl_context *const ctx;
    332    void *scanner;
    333    exec_list translation_unit;
    334    glsl_symbol_table *symbols;
    335 
    336    void *linalloc;
    337 
    338    unsigned num_supported_versions;
    339    struct {
    340       unsigned ver;
    341       uint8_t gl_ver;
    342       bool es;
    343    } supported_versions[16];
    344 
    345    bool es_shader;
    346    unsigned language_version;
    347    unsigned forced_language_version;
    348    bool zero_init;
    349    unsigned gl_version;
    350    gl_shader_stage stage;
    351 
    352    /**
    353     * Default uniform layout qualifiers tracked during parsing.
    354     * Currently affects uniform blocks and uniform buffer variables in
    355     * those blocks.
    356     */
    357    struct ast_type_qualifier *default_uniform_qualifier;
    358 
    359    /**
    360     * Default shader storage layout qualifiers tracked during parsing.
    361     * Currently affects shader storage blocks and shader storage buffer
    362     * variables in those blocks.
    363     */
    364    struct ast_type_qualifier *default_shader_storage_qualifier;
    365 
    366    /**
    367     * Variables to track different cases if a fragment shader redeclares
    368     * built-in variable gl_FragCoord.
    369     *
    370     * Note: These values are computed at ast_to_hir time rather than at parse
    371     * time.
    372     */
    373    bool fs_redeclares_gl_fragcoord;
    374    bool fs_origin_upper_left;
    375    bool fs_pixel_center_integer;
    376    bool fs_redeclares_gl_fragcoord_with_no_layout_qualifiers;
    377 
    378    /**
    379     * True if a geometry shader input primitive type or tessellation control
    380     * output vertices were specified using a layout directive.
    381     *
    382     * Note: these values are computed at ast_to_hir time rather than at parse
    383     * time.
    384     */
    385    bool gs_input_prim_type_specified;
    386    bool tcs_output_vertices_specified;
    387 
    388    /**
    389     * Input layout qualifiers from GLSL 1.50 (geometry shader controls),
    390     * and GLSL 4.00 (tessellation evaluation shader)
    391     */
    392    struct ast_type_qualifier *in_qualifier;
    393 
    394    /**
    395     * True if a compute shader input local size was specified using a layout
    396     * directive.
    397     *
    398     * Note: this value is computed at ast_to_hir time rather than at parse
    399     * time.
    400     */
    401    bool cs_input_local_size_specified;
    402 
    403    /**
    404     * If cs_input_local_size_specified is true, the local size that was
    405     * specified.  Otherwise ignored.
    406     */
    407    unsigned cs_input_local_size[3];
    408 
    409    /**
    410     * True if a compute shader input local variable size was specified using
    411     * a layout directive as specified by ARB_compute_variable_group_size.
    412     */
    413    bool cs_input_local_size_variable_specified;
    414 
    415    /**
    416     * Output layout qualifiers from GLSL 1.50 (geometry shader controls),
    417     * and GLSL 4.00 (tessellation control shader).
    418     */
    419    struct ast_type_qualifier *out_qualifier;
    420 
    421    /**
    422     * Printable list of GLSL versions supported by the current context
    423     *
    424     * \note
    425     * This string should probably be generated per-context instead of per
    426     * invokation of the compiler.  This should be changed when the method of
    427     * tracking supported GLSL versions changes.
    428     */
    429    const char *supported_version_string;
    430 
    431    /**
    432     * Implementation defined limits that affect built-in variables, etc.
    433     *
    434     * \sa struct gl_constants (in mtypes.h)
    435     */
    436    struct {
    437       /* 1.10 */
    438       unsigned MaxLights;
    439       unsigned MaxClipPlanes;
    440       unsigned MaxTextureUnits;
    441       unsigned MaxTextureCoords;
    442       unsigned MaxVertexAttribs;
    443       unsigned MaxVertexUniformComponents;
    444       unsigned MaxVertexTextureImageUnits;
    445       unsigned MaxCombinedTextureImageUnits;
    446       unsigned MaxTextureImageUnits;
    447       unsigned MaxFragmentUniformComponents;
    448 
    449       /* ARB_draw_buffers */
    450       unsigned MaxDrawBuffers;
    451 
    452       /* ARB_enhanced_layouts */
    453       unsigned MaxTransformFeedbackBuffers;
    454       unsigned MaxTransformFeedbackInterleavedComponents;
    455 
    456       /* ARB_blend_func_extended */
    457       unsigned MaxDualSourceDrawBuffers;
    458 
    459       /* 3.00 ES */
    460       int MinProgramTexelOffset;
    461       int MaxProgramTexelOffset;
    462 
    463       /* 1.50 */
    464       unsigned MaxVertexOutputComponents;
    465       unsigned MaxGeometryInputComponents;
    466       unsigned MaxGeometryOutputComponents;
    467       unsigned MaxFragmentInputComponents;
    468       unsigned MaxGeometryTextureImageUnits;
    469       unsigned MaxGeometryOutputVertices;
    470       unsigned MaxGeometryTotalOutputComponents;
    471       unsigned MaxGeometryUniformComponents;
    472 
    473       /* ARB_shader_atomic_counters */
    474       unsigned MaxVertexAtomicCounters;
    475       unsigned MaxTessControlAtomicCounters;
    476       unsigned MaxTessEvaluationAtomicCounters;
    477       unsigned MaxGeometryAtomicCounters;
    478       unsigned MaxFragmentAtomicCounters;
    479       unsigned MaxCombinedAtomicCounters;
    480       unsigned MaxAtomicBufferBindings;
    481 
    482       /* These are also atomic counter related, but they weren't added to
    483        * until atomic counters were added to core in GLSL 4.20 and GLSL ES
    484        * 3.10.
    485        */
    486       unsigned MaxVertexAtomicCounterBuffers;
    487       unsigned MaxTessControlAtomicCounterBuffers;
    488       unsigned MaxTessEvaluationAtomicCounterBuffers;
    489       unsigned MaxGeometryAtomicCounterBuffers;
    490       unsigned MaxFragmentAtomicCounterBuffers;
    491       unsigned MaxCombinedAtomicCounterBuffers;
    492       unsigned MaxAtomicCounterBufferSize;
    493 
    494       /* ARB_compute_shader */
    495       unsigned MaxComputeAtomicCounterBuffers;
    496       unsigned MaxComputeAtomicCounters;
    497       unsigned MaxComputeImageUniforms;
    498       unsigned MaxComputeTextureImageUnits;
    499       unsigned MaxComputeUniformComponents;
    500       unsigned MaxComputeWorkGroupCount[3];
    501       unsigned MaxComputeWorkGroupSize[3];
    502 
    503       /* ARB_shader_image_load_store */
    504       unsigned MaxImageUnits;
    505       unsigned MaxCombinedShaderOutputResources;
    506       unsigned MaxImageSamples;
    507       unsigned MaxVertexImageUniforms;
    508       unsigned MaxTessControlImageUniforms;
    509       unsigned MaxTessEvaluationImageUniforms;
    510       unsigned MaxGeometryImageUniforms;
    511       unsigned MaxFragmentImageUniforms;
    512       unsigned MaxCombinedImageUniforms;
    513 
    514       /* ARB_viewport_array */
    515       unsigned MaxViewports;
    516 
    517       /* ARB_tessellation_shader */
    518       unsigned MaxPatchVertices;
    519       unsigned MaxTessGenLevel;
    520       unsigned MaxTessControlInputComponents;
    521       unsigned MaxTessControlOutputComponents;
    522       unsigned MaxTessControlTextureImageUnits;
    523       unsigned MaxTessEvaluationInputComponents;
    524       unsigned MaxTessEvaluationOutputComponents;
    525       unsigned MaxTessEvaluationTextureImageUnits;
    526       unsigned MaxTessPatchComponents;
    527       unsigned MaxTessControlTotalOutputComponents;
    528       unsigned MaxTessControlUniformComponents;
    529       unsigned MaxTessEvaluationUniformComponents;
    530 
    531       /* GL 4.5 / OES_sample_variables */
    532       unsigned MaxSamples;
    533    } Const;
    534 
    535    /**
    536     * During AST to IR conversion, pointer to current IR function
    537     *
    538     * Will be \c NULL whenever the AST to IR conversion is not inside a
    539     * function definition.
    540     */
    541    class ir_function_signature *current_function;
    542 
    543    /**
    544     * During AST to IR conversion, pointer to the toplevel IR
    545     * instruction list being generated.
    546     */
    547    exec_list *toplevel_ir;
    548 
    549    /** Have we found a return statement in this function? */
    550    bool found_return;
    551 
    552    /** Was there an error during compilation? */
    553    bool error;
    554 
    555    /**
    556     * Are all shader inputs / outputs invariant?
    557     *
    558     * This is set when the 'STDGL invariant(all)' pragma is used.
    559     */
    560    bool all_invariant;
    561 
    562    /** Loop or switch statement containing the current instructions. */
    563    class ast_iteration_statement *loop_nesting_ast;
    564 
    565    struct glsl_switch_state switch_state;
    566 
    567    /** List of structures defined in user code. */
    568    const glsl_type **user_structures;
    569    unsigned num_user_structures;
    570 
    571    char *info_log;
    572 
    573    /**
    574     * \name Enable bits for GLSL extensions
    575     */
    576    /*@{*/
    577    /* ARB extensions go here, sorted alphabetically.
    578     */
    579    bool ARB_ES3_1_compatibility_enable;
    580    bool ARB_ES3_1_compatibility_warn;
    581    bool ARB_ES3_2_compatibility_enable;
    582    bool ARB_ES3_2_compatibility_warn;
    583    bool ARB_arrays_of_arrays_enable;
    584    bool ARB_arrays_of_arrays_warn;
    585    bool ARB_compute_shader_enable;
    586    bool ARB_compute_shader_warn;
    587    bool ARB_compute_variable_group_size_enable;
    588    bool ARB_compute_variable_group_size_warn;
    589    bool ARB_conservative_depth_enable;
    590    bool ARB_conservative_depth_warn;
    591    bool ARB_cull_distance_enable;
    592    bool ARB_cull_distance_warn;
    593    bool ARB_derivative_control_enable;
    594    bool ARB_derivative_control_warn;
    595    bool ARB_draw_buffers_enable;
    596    bool ARB_draw_buffers_warn;
    597    bool ARB_draw_instanced_enable;
    598    bool ARB_draw_instanced_warn;
    599    bool ARB_enhanced_layouts_enable;
    600    bool ARB_enhanced_layouts_warn;
    601    bool ARB_explicit_attrib_location_enable;
    602    bool ARB_explicit_attrib_location_warn;
    603    bool ARB_explicit_uniform_location_enable;
    604    bool ARB_explicit_uniform_location_warn;
    605    bool ARB_fragment_coord_conventions_enable;
    606    bool ARB_fragment_coord_conventions_warn;
    607    bool ARB_fragment_layer_viewport_enable;
    608    bool ARB_fragment_layer_viewport_warn;
    609    bool ARB_gpu_shader5_enable;
    610    bool ARB_gpu_shader5_warn;
    611    bool ARB_gpu_shader_fp64_enable;
    612    bool ARB_gpu_shader_fp64_warn;
    613    bool ARB_post_depth_coverage_enable;
    614    bool ARB_post_depth_coverage_warn;
    615    bool ARB_sample_shading_enable;
    616    bool ARB_sample_shading_warn;
    617    bool ARB_separate_shader_objects_enable;
    618    bool ARB_separate_shader_objects_warn;
    619    bool ARB_shader_atomic_counter_ops_enable;
    620    bool ARB_shader_atomic_counter_ops_warn;
    621    bool ARB_shader_atomic_counters_enable;
    622    bool ARB_shader_atomic_counters_warn;
    623    bool ARB_shader_bit_encoding_enable;
    624    bool ARB_shader_bit_encoding_warn;
    625    bool ARB_shader_clock_enable;
    626    bool ARB_shader_clock_warn;
    627    bool ARB_shader_draw_parameters_enable;
    628    bool ARB_shader_draw_parameters_warn;
    629    bool ARB_shader_group_vote_enable;
    630    bool ARB_shader_group_vote_warn;
    631    bool ARB_shader_image_load_store_enable;
    632    bool ARB_shader_image_load_store_warn;
    633    bool ARB_shader_image_size_enable;
    634    bool ARB_shader_image_size_warn;
    635    bool ARB_shader_precision_enable;
    636    bool ARB_shader_precision_warn;
    637    bool ARB_shader_stencil_export_enable;
    638    bool ARB_shader_stencil_export_warn;
    639    bool ARB_shader_storage_buffer_object_enable;
    640    bool ARB_shader_storage_buffer_object_warn;
    641    bool ARB_shader_subroutine_enable;
    642    bool ARB_shader_subroutine_warn;
    643    bool ARB_shader_texture_image_samples_enable;
    644    bool ARB_shader_texture_image_samples_warn;
    645    bool ARB_shader_texture_lod_enable;
    646    bool ARB_shader_texture_lod_warn;
    647    bool ARB_shader_viewport_layer_array_enable;
    648    bool ARB_shader_viewport_layer_array_warn;
    649    bool ARB_shading_language_420pack_enable;
    650    bool ARB_shading_language_420pack_warn;
    651    bool ARB_shading_language_packing_enable;
    652    bool ARB_shading_language_packing_warn;
    653    bool ARB_tessellation_shader_enable;
    654    bool ARB_tessellation_shader_warn;
    655    bool ARB_texture_cube_map_array_enable;
    656    bool ARB_texture_cube_map_array_warn;
    657    bool ARB_texture_gather_enable;
    658    bool ARB_texture_gather_warn;
    659    bool ARB_texture_multisample_enable;
    660    bool ARB_texture_multisample_warn;
    661    bool ARB_texture_query_levels_enable;
    662    bool ARB_texture_query_levels_warn;
    663    bool ARB_texture_query_lod_enable;
    664    bool ARB_texture_query_lod_warn;
    665    bool ARB_texture_rectangle_enable;
    666    bool ARB_texture_rectangle_warn;
    667    bool ARB_uniform_buffer_object_enable;
    668    bool ARB_uniform_buffer_object_warn;
    669    bool ARB_vertex_attrib_64bit_enable;
    670    bool ARB_vertex_attrib_64bit_warn;
    671    bool ARB_viewport_array_enable;
    672    bool ARB_viewport_array_warn;
    673 
    674    /* KHR extensions go here, sorted alphabetically.
    675     */
    676    bool KHR_blend_equation_advanced_enable;
    677    bool KHR_blend_equation_advanced_warn;
    678 
    679    /* OES extensions go here, sorted alphabetically.
    680     */
    681    bool OES_EGL_image_external_enable;
    682    bool OES_EGL_image_external_warn;
    683    bool OES_geometry_point_size_enable;
    684    bool OES_geometry_point_size_warn;
    685    bool OES_geometry_shader_enable;
    686    bool OES_geometry_shader_warn;
    687    bool OES_gpu_shader5_enable;
    688    bool OES_gpu_shader5_warn;
    689    bool OES_primitive_bounding_box_enable;
    690    bool OES_primitive_bounding_box_warn;
    691    bool OES_sample_variables_enable;
    692    bool OES_sample_variables_warn;
    693    bool OES_shader_image_atomic_enable;
    694    bool OES_shader_image_atomic_warn;
    695    bool OES_shader_io_blocks_enable;
    696    bool OES_shader_io_blocks_warn;
    697    bool OES_shader_multisample_interpolation_enable;
    698    bool OES_shader_multisample_interpolation_warn;
    699    bool OES_standard_derivatives_enable;
    700    bool OES_standard_derivatives_warn;
    701    bool OES_tessellation_point_size_enable;
    702    bool OES_tessellation_point_size_warn;
    703    bool OES_tessellation_shader_enable;
    704    bool OES_tessellation_shader_warn;
    705    bool OES_texture_3D_enable;
    706    bool OES_texture_3D_warn;
    707    bool OES_texture_buffer_enable;
    708    bool OES_texture_buffer_warn;
    709    bool OES_texture_cube_map_array_enable;
    710    bool OES_texture_cube_map_array_warn;
    711    bool OES_texture_storage_multisample_2d_array_enable;
    712    bool OES_texture_storage_multisample_2d_array_warn;
    713    bool OES_viewport_array_enable;
    714    bool OES_viewport_array_warn;
    715 
    716    /* All other extensions go here, sorted alphabetically.
    717     */
    718    bool AMD_conservative_depth_enable;
    719    bool AMD_conservative_depth_warn;
    720    bool AMD_shader_stencil_export_enable;
    721    bool AMD_shader_stencil_export_warn;
    722    bool AMD_shader_trinary_minmax_enable;
    723    bool AMD_shader_trinary_minmax_warn;
    724    bool AMD_vertex_shader_layer_enable;
    725    bool AMD_vertex_shader_layer_warn;
    726    bool AMD_vertex_shader_viewport_index_enable;
    727    bool AMD_vertex_shader_viewport_index_warn;
    728    bool ANDROID_extension_pack_es31a_enable;
    729    bool ANDROID_extension_pack_es31a_warn;
    730    bool EXT_blend_func_extended_enable;
    731    bool EXT_blend_func_extended_warn;
    732    bool EXT_clip_cull_distance_enable;
    733    bool EXT_clip_cull_distance_warn;
    734    bool EXT_draw_buffers_enable;
    735    bool EXT_draw_buffers_warn;
    736    bool EXT_geometry_point_size_enable;
    737    bool EXT_geometry_point_size_warn;
    738    bool EXT_geometry_shader_enable;
    739    bool EXT_geometry_shader_warn;
    740    bool EXT_gpu_shader5_enable;
    741    bool EXT_gpu_shader5_warn;
    742    bool EXT_primitive_bounding_box_enable;
    743    bool EXT_primitive_bounding_box_warn;
    744    bool EXT_separate_shader_objects_enable;
    745    bool EXT_separate_shader_objects_warn;
    746    bool EXT_shader_framebuffer_fetch_enable;
    747    bool EXT_shader_framebuffer_fetch_warn;
    748    bool EXT_shader_integer_mix_enable;
    749    bool EXT_shader_integer_mix_warn;
    750    bool EXT_shader_io_blocks_enable;
    751    bool EXT_shader_io_blocks_warn;
    752    bool EXT_shader_samples_identical_enable;
    753    bool EXT_shader_samples_identical_warn;
    754    bool EXT_tessellation_point_size_enable;
    755    bool EXT_tessellation_point_size_warn;
    756    bool EXT_tessellation_shader_enable;
    757    bool EXT_tessellation_shader_warn;
    758    bool EXT_texture_array_enable;
    759    bool EXT_texture_array_warn;
    760    bool EXT_texture_buffer_enable;
    761    bool EXT_texture_buffer_warn;
    762    bool EXT_texture_cube_map_array_enable;
    763    bool EXT_texture_cube_map_array_warn;
    764    bool INTEL_conservative_rasterization_enable;
    765    bool INTEL_conservative_rasterization_warn;
    766    bool MESA_shader_framebuffer_fetch_enable;
    767    bool MESA_shader_framebuffer_fetch_warn;
    768    bool MESA_shader_framebuffer_fetch_non_coherent_enable;
    769    bool MESA_shader_framebuffer_fetch_non_coherent_warn;
    770    bool MESA_shader_integer_functions_enable;
    771    bool MESA_shader_integer_functions_warn;
    772    bool NV_image_formats_enable;
    773    bool NV_image_formats_warn;
    774    /*@}*/
    775 
    776    /** Extensions supported by the OpenGL implementation. */
    777    const struct gl_extensions *extensions;
    778 
    779    bool uses_builtin_functions;
    780    bool fs_uses_gl_fragcoord;
    781 
    782    /**
    783     * For geometry shaders, size of the most recently seen input declaration
    784     * that was a sized array, or 0 if no sized input array declarations have
    785     * been seen.
    786     *
    787     * Unused for other shader types.
    788     */
    789    unsigned gs_input_size;
    790 
    791    bool fs_early_fragment_tests;
    792 
    793    bool fs_inner_coverage;
    794 
    795    bool fs_post_depth_coverage;
    796 
    797    unsigned fs_blend_support;
    798 
    799    /**
    800     * For tessellation control shaders, size of the most recently seen output
    801     * declaration that was a sized array, or 0 if no sized output array
    802     * declarations have been seen.
    803     *
    804     * Unused for other shader types.
    805     */
    806    unsigned tcs_output_size;
    807 
    808    /** Atomic counter offsets by binding */
    809    unsigned atomic_counter_offsets[MAX_COMBINED_ATOMIC_BUFFERS];
    810 
    811    bool allow_extension_directive_midshader;
    812 
    813    /**
    814     * Known subroutine type declarations.
    815     */
    816    int num_subroutine_types;
    817    ir_function **subroutine_types;
    818 
    819    /**
    820     * Functions that are associated with
    821     * subroutine types.
    822     */
    823    int num_subroutines;
    824    ir_function **subroutines;
    825 
    826    /**
    827     * field selection temporary parser storage -
    828     * did the parser just parse a dot.
    829     */
    830    bool is_field;
    831 
    832    /**
    833     * seen values for clip/cull distance sizes
    834     * so we can check totals aren't too large.
    835     */
    836    unsigned clip_dist_size, cull_dist_size;
    837 };
    838 
    839 # define YYLLOC_DEFAULT(Current, Rhs, N)                        \
    840 do {                                                            \
    841    if (N)                                                       \
    842    {                                                            \
    843       (Current).first_line   = YYRHSLOC(Rhs, 1).first_line;     \
    844       (Current).first_column = YYRHSLOC(Rhs, 1).first_column;   \
    845       (Current).last_line    = YYRHSLOC(Rhs, N).last_line;      \
    846       (Current).last_column  = YYRHSLOC(Rhs, N).last_column;    \
    847    }                                                            \
    848    else                                                         \
    849    {                                                            \
    850       (Current).first_line   = (Current).last_line =            \
    851          YYRHSLOC(Rhs, 0).last_line;                            \
    852       (Current).first_column = (Current).last_column =          \
    853          YYRHSLOC(Rhs, 0).last_column;                          \
    854    }                                                            \
    855    (Current).source = 0;                                        \
    856 } while (0)
    857 
    858 /**
    859  * Emit a warning to the shader log
    860  *
    861  * \sa _mesa_glsl_error
    862  */
    863 extern void _mesa_glsl_warning(const YYLTYPE *locp,
    864                                _mesa_glsl_parse_state *state,
    865                                const char *fmt, ...);
    866 
    867 extern void _mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state,
    868                                   const char *string);
    869 
    870 extern void _mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state);
    871 
    872 union YYSTYPE;
    873 extern int _mesa_glsl_lexer_lex(union YYSTYPE *yylval, YYLTYPE *yylloc,
    874                                 void *scanner);
    875 
    876 extern int _mesa_glsl_parse(struct _mesa_glsl_parse_state *);
    877 
    878 /**
    879  * Process elements of the #extension directive
    880  *
    881  * \return
    882  * If \c name and \c behavior are valid, \c true is returned.  Otherwise
    883  * \c false is returned.
    884  */
    885 extern bool _mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp,
    886                                          const char *behavior,
    887                                          YYLTYPE *behavior_locp,
    888                                          _mesa_glsl_parse_state *state);
    889 
    890 #endif /* __cplusplus */
    891 
    892 
    893 /*
    894  * These definitions apply to C and C++
    895  */
    896 #ifdef __cplusplus
    897 extern "C" {
    898 #endif
    899 
    900 struct glcpp_parser;
    901 
    902 typedef void (*glcpp_extension_iterator)(
    903               struct _mesa_glsl_parse_state *state,
    904               void (*add_builtin_define)(struct glcpp_parser *, const char *, int),
    905               struct glcpp_parser *data,
    906               unsigned version,
    907               bool es);
    908 
    909 extern int glcpp_preprocess(void *ctx, const char **shader, char **info_log,
    910                             glcpp_extension_iterator extensions,
    911                             struct _mesa_glsl_parse_state *state,
    912                             struct gl_context *gl_ctx);
    913 
    914 extern void _mesa_destroy_shader_compiler(void);
    915 extern void _mesa_destroy_shader_compiler_caches(void);
    916 
    917 #ifdef __cplusplus
    918 }
    919 #endif
    920 
    921 
    922 #endif /* GLSL_PARSER_EXTRAS_H */
    923