Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  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_RALLOC_CXX_OPERATORS(_mesa_glsl_parse_state);
  80.  
  81.    /**
  82.     * Generate a string representing the GLSL version currently being compiled
  83.     * (useful for error messages).
  84.     */
  85.    const char *get_version_string()
  86.    {
  87.       return glsl_compute_version_string(this, this->es_shader,
  88.                                          this->language_version);
  89.    }
  90.  
  91.    /**
  92.     * Determine whether the current GLSL version is sufficiently high to
  93.     * support a certain feature.
  94.     *
  95.     * \param required_glsl_version is the desktop GLSL version that is
  96.     * required to support the feature, or 0 if no version of desktop GLSL
  97.     * supports the feature.
  98.     *
  99.     * \param required_glsl_es_version is the GLSL ES version that is required
  100.     * to support the feature, or 0 if no version of GLSL ES suports the
  101.     * feature.
  102.     */
  103.    bool is_version(unsigned required_glsl_version,
  104.                    unsigned required_glsl_es_version) const
  105.    {
  106.       unsigned required_version = this->es_shader ?
  107.          required_glsl_es_version : required_glsl_version;
  108.       unsigned this_version = this->forced_language_version
  109.          ? this->forced_language_version : this->language_version;
  110.       return required_version != 0
  111.          && this_version >= required_version;
  112.    }
  113.  
  114.    bool check_version(unsigned required_glsl_version,
  115.                       unsigned required_glsl_es_version,
  116.                       YYLTYPE *locp, const char *fmt, ...) PRINTFLIKE(5, 6);
  117.  
  118.    bool check_precision_qualifiers_allowed(YYLTYPE *locp)
  119.    {
  120.       return check_version(130, 100, locp,
  121.                            "precision qualifiers are forbidden");
  122.    }
  123.  
  124.    bool check_bitwise_operations_allowed(YYLTYPE *locp)
  125.    {
  126.       return check_version(130, 300, locp, "bit-wise operations are forbidden");
  127.    }
  128.  
  129.    bool check_explicit_attrib_stream_allowed(YYLTYPE *locp)
  130.    {
  131.       if (!this->has_explicit_attrib_stream()) {
  132.          const char *const requirement = "GL_ARB_gpu_shader5 extension or GLSL 400";
  133.  
  134.          _mesa_glsl_error(locp, this, "explicit stream requires %s",
  135.                           requirement);
  136.          return false;
  137.       }
  138.  
  139.       return true;
  140.    }
  141.  
  142.    bool check_explicit_attrib_location_allowed(YYLTYPE *locp,
  143.                                                const ir_variable *var)
  144.    {
  145.       if (!this->has_explicit_attrib_location()) {
  146.          const char *const requirement = this->es_shader
  147.             ? "GLSL ES 300"
  148.             : "GL_ARB_explicit_attrib_location extension or GLSL 330";
  149.  
  150.          _mesa_glsl_error(locp, this, "%s explicit location requires %s",
  151.                           mode_string(var), requirement);
  152.          return false;
  153.       }
  154.  
  155.       return true;
  156.    }
  157.  
  158.    bool check_separate_shader_objects_allowed(YYLTYPE *locp,
  159.                                               const ir_variable *var)
  160.    {
  161.       if (!this->has_separate_shader_objects()) {
  162.          const char *const requirement = this->es_shader
  163.             ? "GL_EXT_separate_shader_objects extension or GLSL ES 310"
  164.             : "GL_ARB_separate_shader_objects extension or GLSL 420";
  165.  
  166.          _mesa_glsl_error(locp, this, "%s explicit location requires %s",
  167.                           mode_string(var), requirement);
  168.          return false;
  169.       }
  170.  
  171.       return true;
  172.    }
  173.  
  174.    bool check_explicit_uniform_location_allowed(YYLTYPE *locp,
  175.                                                 const ir_variable *)
  176.    {
  177.       if (!this->has_explicit_attrib_location() ||
  178.           !this->has_explicit_uniform_location()) {
  179.          const char *const requirement = this->es_shader
  180.             ? "GLSL ES 310"
  181.             : "GL_ARB_explicit_uniform_location and either "
  182.               "GL_ARB_explicit_attrib_location or GLSL 330.";
  183.  
  184.          _mesa_glsl_error(locp, this,
  185.                           "uniform explicit location requires %s",
  186.                           requirement);
  187.          return false;
  188.       }
  189.  
  190.       return true;
  191.    }
  192.  
  193.    bool has_atomic_counters() const
  194.    {
  195.       return ARB_shader_atomic_counters_enable || is_version(420, 310);
  196.    }
  197.  
  198.    bool has_explicit_attrib_stream() const
  199.    {
  200.       return ARB_gpu_shader5_enable || is_version(400, 0);
  201.    }
  202.  
  203.    bool has_explicit_attrib_location() const
  204.    {
  205.       return ARB_explicit_attrib_location_enable || is_version(330, 300);
  206.    }
  207.  
  208.    bool has_explicit_uniform_location() const
  209.    {
  210.       return ARB_explicit_uniform_location_enable || is_version(430, 310);
  211.    }
  212.  
  213.    bool has_uniform_buffer_objects() const
  214.    {
  215.       return ARB_uniform_buffer_object_enable || is_version(140, 300);
  216.    }
  217.  
  218.    bool has_separate_shader_objects() const
  219.    {
  220.       return ARB_separate_shader_objects_enable || is_version(410, 310)
  221.          || EXT_separate_shader_objects_enable;
  222.    }
  223.  
  224.    bool has_double() const
  225.    {
  226.       return ARB_gpu_shader_fp64_enable || is_version(400, 0);
  227.    }
  228.  
  229.    void process_version_directive(YYLTYPE *locp, int version,
  230.                                   const char *ident);
  231.  
  232.    struct gl_context *const ctx;
  233.    void *scanner;
  234.    exec_list translation_unit;
  235.    glsl_symbol_table *symbols;
  236.  
  237.    unsigned num_supported_versions;
  238.    struct {
  239.       unsigned ver;
  240.       bool es;
  241.    } supported_versions[15];
  242.  
  243.    bool es_shader;
  244.    unsigned language_version;
  245.    unsigned forced_language_version;
  246.    gl_shader_stage stage;
  247.  
  248.    /**
  249.     * Number of nested struct_specifier levels
  250.     *
  251.     * Outside a struct_specifier, this is zero.
  252.     */
  253.    unsigned struct_specifier_depth;
  254.  
  255.    /**
  256.     * Default uniform layout qualifiers tracked during parsing.
  257.     * Currently affects uniform blocks and uniform buffer variables in
  258.     * those blocks.
  259.     */
  260.    struct ast_type_qualifier *default_uniform_qualifier;
  261.  
  262.    /**
  263.     * Variables to track different cases if a fragment shader redeclares
  264.     * built-in variable gl_FragCoord.
  265.     *
  266.     * Note: These values are computed at ast_to_hir time rather than at parse
  267.     * time.
  268.     */
  269.    bool fs_redeclares_gl_fragcoord;
  270.    bool fs_origin_upper_left;
  271.    bool fs_pixel_center_integer;
  272.    bool fs_redeclares_gl_fragcoord_with_no_layout_qualifiers;
  273.  
  274.    /**
  275.     * True if a geometry shader input primitive type was specified using a
  276.     * layout directive.
  277.     *
  278.     * Note: this value is computed at ast_to_hir time rather than at parse
  279.     * time.
  280.     */
  281.    bool gs_input_prim_type_specified;
  282.  
  283.    /** Input layout qualifiers from GLSL 1.50. (geometry shader controls)*/
  284.    struct ast_type_qualifier *in_qualifier;
  285.  
  286.    /**
  287.     * True if a compute shader input local size was specified using a layout
  288.     * directive.
  289.     *
  290.     * Note: this value is computed at ast_to_hir time rather than at parse
  291.     * time.
  292.     */
  293.    bool cs_input_local_size_specified;
  294.  
  295.    /**
  296.     * If cs_input_local_size_specified is true, the local size that was
  297.     * specified.  Otherwise ignored.
  298.     */
  299.    unsigned cs_input_local_size[3];
  300.  
  301.    /** Output layout qualifiers from GLSL 1.50. (geometry shader controls)*/
  302.    struct ast_type_qualifier *out_qualifier;
  303.  
  304.    /**
  305.     * Printable list of GLSL versions supported by the current context
  306.     *
  307.     * \note
  308.     * This string should probably be generated per-context instead of per
  309.     * invokation of the compiler.  This should be changed when the method of
  310.     * tracking supported GLSL versions changes.
  311.     */
  312.    const char *supported_version_string;
  313.  
  314.    /**
  315.     * Implementation defined limits that affect built-in variables, etc.
  316.     *
  317.     * \sa struct gl_constants (in mtypes.h)
  318.     */
  319.    struct {
  320.       /* 1.10 */
  321.       unsigned MaxLights;
  322.       unsigned MaxClipPlanes;
  323.       unsigned MaxTextureUnits;
  324.       unsigned MaxTextureCoords;
  325.       unsigned MaxVertexAttribs;
  326.       unsigned MaxVertexUniformComponents;
  327.       unsigned MaxVertexTextureImageUnits;
  328.       unsigned MaxCombinedTextureImageUnits;
  329.       unsigned MaxTextureImageUnits;
  330.       unsigned MaxFragmentUniformComponents;
  331.  
  332.       /* ARB_draw_buffers */
  333.       unsigned MaxDrawBuffers;
  334.  
  335.       /* 3.00 ES */
  336.       int MinProgramTexelOffset;
  337.       int MaxProgramTexelOffset;
  338.  
  339.       /* 1.50 */
  340.       unsigned MaxVertexOutputComponents;
  341.       unsigned MaxGeometryInputComponents;
  342.       unsigned MaxGeometryOutputComponents;
  343.       unsigned MaxFragmentInputComponents;
  344.       unsigned MaxGeometryTextureImageUnits;
  345.       unsigned MaxGeometryOutputVertices;
  346.       unsigned MaxGeometryTotalOutputComponents;
  347.       unsigned MaxGeometryUniformComponents;
  348.  
  349.       /* ARB_shader_atomic_counters */
  350.       unsigned MaxVertexAtomicCounters;
  351.       unsigned MaxGeometryAtomicCounters;
  352.       unsigned MaxFragmentAtomicCounters;
  353.       unsigned MaxCombinedAtomicCounters;
  354.       unsigned MaxAtomicBufferBindings;
  355.  
  356.       /* These are also atomic counter related, but they weren't added to
  357.        * until atomic counters were added to core in GLSL 4.20 and GLSL ES
  358.        * 3.10.
  359.        */
  360.       unsigned MaxVertexAtomicCounterBuffers;
  361.       unsigned MaxGeometryAtomicCounterBuffers;
  362.       unsigned MaxFragmentAtomicCounterBuffers;
  363.       unsigned MaxCombinedAtomicCounterBuffers;
  364.       unsigned MaxAtomicCounterBufferSize;
  365.  
  366.       /* ARB_compute_shader */
  367.       unsigned MaxComputeWorkGroupCount[3];
  368.       unsigned MaxComputeWorkGroupSize[3];
  369.  
  370.       /* ARB_shader_image_load_store */
  371.       unsigned MaxImageUnits;
  372.       unsigned MaxCombinedImageUnitsAndFragmentOutputs;
  373.       unsigned MaxImageSamples;
  374.       unsigned MaxVertexImageUniforms;
  375.       unsigned MaxGeometryImageUniforms;
  376.       unsigned MaxFragmentImageUniforms;
  377.       unsigned MaxCombinedImageUniforms;
  378.  
  379.       /* ARB_viewport_array */
  380.       unsigned MaxViewports;
  381.    } Const;
  382.  
  383.    /**
  384.     * During AST to IR conversion, pointer to current IR function
  385.     *
  386.     * Will be \c NULL whenever the AST to IR conversion is not inside a
  387.     * function definition.
  388.     */
  389.    class ir_function_signature *current_function;
  390.  
  391.    /**
  392.     * During AST to IR conversion, pointer to the toplevel IR
  393.     * instruction list being generated.
  394.     */
  395.    exec_list *toplevel_ir;
  396.  
  397.    /** Have we found a return statement in this function? */
  398.    bool found_return;
  399.  
  400.    /** Was there an error during compilation? */
  401.    bool error;
  402.  
  403.    /**
  404.     * Are all shader inputs / outputs invariant?
  405.     *
  406.     * This is set when the 'STDGL invariant(all)' pragma is used.
  407.     */
  408.    bool all_invariant;
  409.  
  410.    /** Loop or switch statement containing the current instructions. */
  411.    class ast_iteration_statement *loop_nesting_ast;
  412.  
  413.    struct glsl_switch_state switch_state;
  414.  
  415.    /** List of structures defined in user code. */
  416.    const glsl_type **user_structures;
  417.    unsigned num_user_structures;
  418.  
  419.    char *info_log;
  420.  
  421.    /**
  422.     * \name Enable bits for GLSL extensions
  423.     */
  424.    /*@{*/
  425.    /* ARB extensions go here, sorted alphabetically.
  426.     */
  427.    bool ARB_arrays_of_arrays_enable;
  428.    bool ARB_arrays_of_arrays_warn;
  429.    bool ARB_compute_shader_enable;
  430.    bool ARB_compute_shader_warn;
  431.    bool ARB_conservative_depth_enable;
  432.    bool ARB_conservative_depth_warn;
  433.    bool ARB_derivative_control_enable;
  434.    bool ARB_derivative_control_warn;
  435.    bool ARB_draw_buffers_enable;
  436.    bool ARB_draw_buffers_warn;
  437.    bool ARB_draw_instanced_enable;
  438.    bool ARB_draw_instanced_warn;
  439.    bool ARB_explicit_attrib_location_enable;
  440.    bool ARB_explicit_attrib_location_warn;
  441.    bool ARB_explicit_uniform_location_enable;
  442.    bool ARB_explicit_uniform_location_warn;
  443.    bool ARB_fragment_coord_conventions_enable;
  444.    bool ARB_fragment_coord_conventions_warn;
  445.    bool ARB_fragment_layer_viewport_enable;
  446.    bool ARB_fragment_layer_viewport_warn;
  447.    bool ARB_gpu_shader5_enable;
  448.    bool ARB_gpu_shader5_warn;
  449.    bool ARB_gpu_shader_fp64_enable;
  450.    bool ARB_gpu_shader_fp64_warn;
  451.    bool ARB_sample_shading_enable;
  452.    bool ARB_sample_shading_warn;
  453.    bool ARB_separate_shader_objects_enable;
  454.    bool ARB_separate_shader_objects_warn;
  455.    bool ARB_shader_atomic_counters_enable;
  456.    bool ARB_shader_atomic_counters_warn;
  457.    bool ARB_shader_bit_encoding_enable;
  458.    bool ARB_shader_bit_encoding_warn;
  459.    bool ARB_shader_image_load_store_enable;
  460.    bool ARB_shader_image_load_store_warn;
  461.    bool ARB_shader_precision_enable;
  462.    bool ARB_shader_precision_warn;
  463.    bool ARB_shader_stencil_export_enable;
  464.    bool ARB_shader_stencil_export_warn;
  465.    bool ARB_shader_texture_lod_enable;
  466.    bool ARB_shader_texture_lod_warn;
  467.    bool ARB_shading_language_420pack_enable;
  468.    bool ARB_shading_language_420pack_warn;
  469.    bool ARB_shading_language_packing_enable;
  470.    bool ARB_shading_language_packing_warn;
  471.    bool ARB_texture_cube_map_array_enable;
  472.    bool ARB_texture_cube_map_array_warn;
  473.    bool ARB_texture_gather_enable;
  474.    bool ARB_texture_gather_warn;
  475.    bool ARB_texture_multisample_enable;
  476.    bool ARB_texture_multisample_warn;
  477.    bool ARB_texture_query_levels_enable;
  478.    bool ARB_texture_query_levels_warn;
  479.    bool ARB_texture_query_lod_enable;
  480.    bool ARB_texture_query_lod_warn;
  481.    bool ARB_texture_rectangle_enable;
  482.    bool ARB_texture_rectangle_warn;
  483.    bool ARB_uniform_buffer_object_enable;
  484.    bool ARB_uniform_buffer_object_warn;
  485.    bool ARB_vertex_attrib_64bit_enable;
  486.    bool ARB_vertex_attrib_64bit_warn;
  487.    bool ARB_viewport_array_enable;
  488.    bool ARB_viewport_array_warn;
  489.  
  490.    /* KHR extensions go here, sorted alphabetically.
  491.     */
  492.  
  493.    /* OES extensions go here, sorted alphabetically.
  494.     */
  495.    bool OES_EGL_image_external_enable;
  496.    bool OES_EGL_image_external_warn;
  497.    bool OES_standard_derivatives_enable;
  498.    bool OES_standard_derivatives_warn;
  499.    bool OES_texture_3D_enable;
  500.    bool OES_texture_3D_warn;
  501.  
  502.    /* All other extensions go here, sorted alphabetically.
  503.     */
  504.    bool AMD_conservative_depth_enable;
  505.    bool AMD_conservative_depth_warn;
  506.    bool AMD_shader_stencil_export_enable;
  507.    bool AMD_shader_stencil_export_warn;
  508.    bool AMD_shader_trinary_minmax_enable;
  509.    bool AMD_shader_trinary_minmax_warn;
  510.    bool AMD_vertex_shader_layer_enable;
  511.    bool AMD_vertex_shader_layer_warn;
  512.    bool AMD_vertex_shader_viewport_index_enable;
  513.    bool AMD_vertex_shader_viewport_index_warn;
  514.    bool EXT_draw_buffers_enable;
  515.    bool EXT_draw_buffers_warn;
  516.    bool EXT_separate_shader_objects_enable;
  517.    bool EXT_separate_shader_objects_warn;
  518.    bool EXT_shader_integer_mix_enable;
  519.    bool EXT_shader_integer_mix_warn;
  520.    bool EXT_texture_array_enable;
  521.    bool EXT_texture_array_warn;
  522.    /*@}*/
  523.  
  524.    /** Extensions supported by the OpenGL implementation. */
  525.    const struct gl_extensions *extensions;
  526.  
  527.    bool uses_builtin_functions;
  528.    bool fs_uses_gl_fragcoord;
  529.  
  530.    /**
  531.     * For geometry shaders, size of the most recently seen input declaration
  532.     * that was a sized array, or 0 if no sized input array declarations have
  533.     * been seen.
  534.     *
  535.     * Unused for other shader types.
  536.     */
  537.    unsigned gs_input_size;
  538.  
  539.    bool fs_early_fragment_tests;
  540.  
  541.    /** Atomic counter offsets by binding */
  542.    unsigned atomic_counter_offsets[MAX_COMBINED_ATOMIC_BUFFERS];
  543.  
  544.    bool allow_extension_directive_midshader;
  545. };
  546.  
  547. # define YYLLOC_DEFAULT(Current, Rhs, N)                        \
  548. do {                                                            \
  549.    if (N)                                                       \
  550.    {                                                            \
  551.       (Current).first_line   = YYRHSLOC(Rhs, 1).first_line;     \
  552.       (Current).first_column = YYRHSLOC(Rhs, 1).first_column;   \
  553.       (Current).last_line    = YYRHSLOC(Rhs, N).last_line;      \
  554.       (Current).last_column  = YYRHSLOC(Rhs, N).last_column;    \
  555.    }                                                            \
  556.    else                                                         \
  557.    {                                                            \
  558.       (Current).first_line   = (Current).last_line =            \
  559.          YYRHSLOC(Rhs, 0).last_line;                            \
  560.       (Current).first_column = (Current).last_column =          \
  561.          YYRHSLOC(Rhs, 0).last_column;                          \
  562.    }                                                            \
  563.    (Current).source = 0;                                        \
  564. } while (0)
  565.  
  566. /**
  567.  * Emit a warning to the shader log
  568.  *
  569.  * \sa _mesa_glsl_error
  570.  */
  571. extern void _mesa_glsl_warning(const YYLTYPE *locp,
  572.                                _mesa_glsl_parse_state *state,
  573.                                const char *fmt, ...);
  574.  
  575. extern void _mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state,
  576.                                   const char *string);
  577.  
  578. extern void _mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state);
  579.  
  580. union YYSTYPE;
  581. extern int _mesa_glsl_lexer_lex(union YYSTYPE *yylval, YYLTYPE *yylloc,
  582.                                 void *scanner);
  583.  
  584. extern int _mesa_glsl_parse(struct _mesa_glsl_parse_state *);
  585.  
  586. /**
  587.  * Process elements of the #extension directive
  588.  *
  589.  * \return
  590.  * If \c name and \c behavior are valid, \c true is returned.  Otherwise
  591.  * \c false is returned.
  592.  */
  593. extern bool _mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp,
  594.                                          const char *behavior,
  595.                                          YYLTYPE *behavior_locp,
  596.                                          _mesa_glsl_parse_state *state);
  597.  
  598. #endif /* __cplusplus */
  599.  
  600.  
  601. /*
  602.  * These definitions apply to C and C++
  603.  */
  604. #ifdef __cplusplus
  605. extern "C" {
  606. #endif
  607.  
  608. /**
  609.  * Get the textual name of the specified shader stage (which is a
  610.  * gl_shader_stage).
  611.  */
  612. extern const char *
  613. _mesa_shader_stage_to_string(unsigned stage);
  614.  
  615. extern const char *
  616. _mesa_shader_stage_to_abbrev(unsigned stage);
  617.  
  618. extern int glcpp_preprocess(void *ctx, const char **shader, char **info_log,
  619.                       const struct gl_extensions *extensions, struct gl_context *gl_ctx);
  620.  
  621. extern void _mesa_destroy_shader_compiler(void);
  622. extern void _mesa_destroy_shader_compiler_caches(void);
  623.  
  624. #ifdef __cplusplus
  625. }
  626. #endif
  627.  
  628.  
  629. #endif /* GLSL_PARSER_EXTRAS_H */
  630.