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