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