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