Home | History | Annotate | Download | only in glsl
      1 /*
      2  * Copyright  2010 Intel Corporation
      3  *
      4  * Permission is hereby granted, free of charge, to any person obtaining a
      5  * copy of this software and associated documentation files (the "Software"),
      6  * to deal in the Software without restriction, including without limitation
      7  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
      8  * and/or sell copies of the Software, and to permit persons to whom the
      9  * Software is furnished to do so, subject to the following conditions:
     10  *
     11  * The above copyright notice and this permission notice (including the next
     12  * paragraph) shall be included in all copies or substantial portions of the
     13  * Software.
     14  *
     15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     16  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     17  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
     18  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     19  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     20  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     21  * DEALINGS IN THE SOFTWARE.
     22  */
     23 
     24 #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 <cstdlib>
     35 #include "glsl_symbol_table.h"
     36 
     37 enum _mesa_glsl_parser_targets {
     38    vertex_shader,
     39    geometry_shader,
     40    fragment_shader
     41 };
     42 
     43 struct gl_context;
     44 
     45 struct _mesa_glsl_parse_state {
     46    _mesa_glsl_parse_state(const struct gl_context *ctx, GLenum target,
     47 			  void *mem_ctx);
     48 
     49    /* Callers of this hieralloc-based new need not call delete. It's
     50     * easier to just hieralloc_free 'ctx' (or any of its ancestors). */
     51    static void* operator new(size_t size, void *ctx)
     52    {
     53       void *mem = hieralloc_zero_size(ctx, size);
     54       assert(mem != NULL);
     55 
     56       return mem;
     57    }
     58 
     59    /* If the user *does* call delete, that's OK, we will just
     60     * hieralloc_free in that case. */
     61    static void operator delete(void *mem)
     62    {
     63       hieralloc_free(mem);
     64    }
     65 
     66    void *scanner;
     67    exec_list translation_unit;
     68    glsl_symbol_table *symbols;
     69 
     70    bool es_shader;
     71    unsigned language_version;
     72    enum _mesa_glsl_parser_targets target;
     73 
     74    /**
     75     * Implementation defined limits that affect built-in variables, etc.
     76     *
     77     * \sa struct gl_constants (in mtypes.h)
     78     */
     79    struct {
     80       /* 1.10 */
     81       unsigned MaxLights;
     82       unsigned MaxClipPlanes;
     83       unsigned MaxTextureUnits;
     84       unsigned MaxTextureCoords;
     85       unsigned MaxVertexAttribs;
     86       unsigned MaxVertexUniformComponents;
     87       unsigned MaxVaryingFloats;
     88       unsigned MaxVertexTextureImageUnits;
     89       unsigned MaxCombinedTextureImageUnits;
     90       unsigned MaxTextureImageUnits;
     91       unsigned MaxFragmentUniformComponents;
     92 
     93       /* ARB_draw_buffers */
     94       unsigned MaxDrawBuffers;
     95    } Const;
     96 
     97    /**
     98     * During AST to IR conversion, pointer to current IR function
     99     *
    100     * Will be \c NULL whenever the AST to IR conversion is not inside a
    101     * function definition.
    102     */
    103    class ir_function_signature *current_function;
    104 
    105    /** Have we found a return statement in this function? */
    106    bool found_return;
    107 
    108    /** Was there an error during compilation? */
    109    bool error;
    110 
    111    /** Loop or switch statement containing the current instructions. */
    112    class ir_instruction *loop_or_switch_nesting;
    113    class ast_iteration_statement *loop_or_switch_nesting_ast;
    114 
    115    /** List of structures defined in user code. */
    116    const glsl_type **user_structures;
    117    unsigned num_user_structures;
    118 
    119    char *info_log;
    120 
    121    /**
    122     * \name Enable bits for GLSL extensions
    123     */
    124    /*@{*/
    125    unsigned ARB_draw_buffers_enable:1;
    126    unsigned ARB_draw_buffers_warn:1;
    127    unsigned ARB_explicit_attrib_location_enable:1;
    128    unsigned ARB_explicit_attrib_location_warn:1;
    129    unsigned ARB_fragment_coord_conventions_enable:1;
    130    unsigned ARB_fragment_coord_conventions_warn:1;
    131    unsigned ARB_texture_rectangle_enable:1;
    132    unsigned ARB_texture_rectangle_warn:1;
    133    unsigned EXT_texture_array_enable:1;
    134    unsigned EXT_texture_array_warn:1;
    135    unsigned ARB_shader_stencil_export_enable:1;
    136    unsigned ARB_shader_stencil_export_warn:1;
    137    /*@}*/
    138 
    139    /** Extensions supported by the OpenGL implementation. */
    140    const struct gl_extensions *extensions;
    141 
    142    /** Shaders containing built-in functions that are used for linking. */
    143    struct gl_shader *builtins_to_link[16];
    144    unsigned num_builtins_to_link;
    145 };
    146 
    147 typedef struct YYLTYPE {
    148    int first_line;
    149    int first_column;
    150    int last_line;
    151    int last_column;
    152    unsigned source;
    153 } YYLTYPE;
    154 # define YYLTYPE_IS_DECLARED 1
    155 # define YYLTYPE_IS_TRIVIAL 1
    156 
    157 # define YYLLOC_DEFAULT(Current, Rhs, N)			\
    158 do {								\
    159    if (N)							\
    160    {								\
    161       (Current).first_line   = YYRHSLOC(Rhs, 1).first_line;	\
    162       (Current).first_column = YYRHSLOC(Rhs, 1).first_column;	\
    163       (Current).last_line    = YYRHSLOC(Rhs, N).last_line;	\
    164       (Current).last_column  = YYRHSLOC(Rhs, N).last_column;	\
    165    }								\
    166    else								\
    167    {								\
    168       (Current).first_line   = (Current).last_line =		\
    169 	 YYRHSLOC(Rhs, 0).last_line;				\
    170       (Current).first_column = (Current).last_column =		\
    171 	 YYRHSLOC(Rhs, 0).last_column;				\
    172    }								\
    173    (Current).source = 0;					\
    174 } while (0)
    175 
    176 extern void _mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state,
    177 			     const char *fmt, ...);
    178 
    179 /**
    180  * Emit a warning to the shader log
    181  *
    182  * \sa _mesa_glsl_error
    183  */
    184 extern void _mesa_glsl_warning(const YYLTYPE *locp,
    185 			       _mesa_glsl_parse_state *state,
    186 			       const char *fmt, ...);
    187 
    188 extern void _mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state,
    189 				  const char *string);
    190 
    191 extern void _mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state);
    192 
    193 union YYSTYPE;
    194 extern int _mesa_glsl_lex(union YYSTYPE *yylval, YYLTYPE *yylloc,
    195 			  void *scanner);
    196 
    197 extern int _mesa_glsl_parse(struct _mesa_glsl_parse_state *);
    198 
    199 /**
    200  * Process elements of the #extension directive
    201  *
    202  * \return
    203  * If \c name and \c behavior are valid, \c true is returned.  Otherwise
    204  * \c false is returned.
    205  */
    206 extern bool _mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp,
    207 					 const char *behavior,
    208 					 YYLTYPE *behavior_locp,
    209 					 _mesa_glsl_parse_state *state);
    210 
    211 /**
    212  * Get the textual name of the specified shader target
    213  */
    214 extern const char *
    215 _mesa_glsl_shader_target_name(enum _mesa_glsl_parser_targets target);
    216 
    217 
    218 #endif /* __cplusplus */
    219 
    220 
    221 /*
    222  * These definitions apply to C and C++
    223  */
    224 #ifdef __cplusplus
    225 extern "C" {
    226 #endif
    227 
    228 extern int preprocess(void *ctx, const char **shader, char **info_log,
    229                       const struct gl_extensions *extensions, int api);
    230 
    231 extern void _mesa_destroy_shader_compiler();
    232 extern void _mesa_destroy_shader_compiler_caches();
    233 
    234 #ifdef __cplusplus
    235 }
    236 #endif
    237 
    238 
    239 #endif /* GLSL_PARSER_EXTRAS_H */
    240