• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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     */
get_version_string_mesa_glsl_parse_state84    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     */
is_version_mesa_glsl_parse_state102    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 
check_arrays_of_arrays_allowed_mesa_glsl_parse_state117    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 
check_precision_qualifiers_allowed_mesa_glsl_parse_state131    bool check_precision_qualifiers_allowed(YYLTYPE *locp)
132    {
133       return check_version(130, 100, locp,
134                            "precision qualifiers are forbidden");
135    }
136 
check_bitwise_operations_allowed_mesa_glsl_parse_state137    bool check_bitwise_operations_allowed(YYLTYPE *locp)
138    {
139       return check_version(130, 300, locp, "bit-wise operations are forbidden");
140    }
141 
check_explicit_attrib_stream_allowed_mesa_glsl_parse_state142    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 
check_explicit_attrib_location_allowed_mesa_glsl_parse_state155    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 
check_separate_shader_objects_allowed_mesa_glsl_parse_state171    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 
check_explicit_uniform_location_allowed_mesa_glsl_parse_state187    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 
has_atomic_counters_mesa_glsl_parse_state206    bool has_atomic_counters() const
207    {
208       return ARB_shader_atomic_counters_enable || is_version(420, 310);
209    }
210 
has_enhanced_layouts_mesa_glsl_parse_state211    bool has_enhanced_layouts() const
212    {
213       return ARB_enhanced_layouts_enable || is_version(440, 0);
214    }
215 
has_explicit_attrib_stream_mesa_glsl_parse_state216    bool has_explicit_attrib_stream() const
217    {
218       return ARB_gpu_shader5_enable || is_version(400, 0);
219    }
220 
has_explicit_attrib_location_mesa_glsl_parse_state221    bool has_explicit_attrib_location() const
222    {
223       return ARB_explicit_attrib_location_enable || is_version(330, 300);
224    }
225 
has_explicit_uniform_location_mesa_glsl_parse_state226    bool has_explicit_uniform_location() const
227    {
228       return ARB_explicit_uniform_location_enable || is_version(430, 310);
229    }
230 
has_uniform_buffer_objects_mesa_glsl_parse_state231    bool has_uniform_buffer_objects() const
232    {
233       return ARB_uniform_buffer_object_enable || is_version(140, 300);
234    }
235 
has_shader_storage_buffer_objects_mesa_glsl_parse_state236    bool has_shader_storage_buffer_objects() const
237    {
238       return ARB_shader_storage_buffer_object_enable || is_version(430, 310);
239    }
240 
has_separate_shader_objects_mesa_glsl_parse_state241    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 
has_double_mesa_glsl_parse_state247    bool has_double() const
248    {
249       return ARB_gpu_shader_fp64_enable || is_version(400, 0);
250    }
251 
has_int64_mesa_glsl_parse_state252    bool has_int64() const
253    {
254       return ARB_gpu_shader_int64_enable;
255    }
256 
has_420pack_mesa_glsl_parse_state257    bool has_420pack() const
258    {
259       return ARB_shading_language_420pack_enable || is_version(420, 0);
260    }
261 
has_420pack_or_es31_mesa_glsl_parse_state262    bool has_420pack_or_es31() const
263    {
264       return ARB_shading_language_420pack_enable || is_version(420, 310);
265    }
266 
has_compute_shader_mesa_glsl_parse_state267    bool has_compute_shader() const
268    {
269       return ARB_compute_shader_enable || is_version(430, 310);
270    }
271 
has_shader_io_blocks_mesa_glsl_parse_state272    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 
has_geometry_shader_mesa_glsl_parse_state291    bool has_geometry_shader() const
292    {
293       return OES_geometry_shader_enable || EXT_geometry_shader_enable ||
294              is_version(150, 320);
295    }
296 
has_tessellation_shader_mesa_glsl_parse_state297    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 
has_clip_distance_mesa_glsl_parse_state305    bool has_clip_distance() const
306    {
307       return EXT_clip_cull_distance_enable || is_version(130, 0);
308    }
309 
has_cull_distance_mesa_glsl_parse_state310    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 
has_framebuffer_fetch_mesa_glsl_parse_state317    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 
has_texture_cube_map_array_mesa_glsl_parse_state324    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 
has_shader_image_load_store_mesa_glsl_parse_state332    bool has_shader_image_load_store() const
333    {
334       return ARB_shader_image_load_store_enable || is_version(420, 310);
335    }
336 
has_bindless_mesa_glsl_parse_state337    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