Subversion Repositories Kolibri OS

Rev

Go to most recent revision | Blame | Last modification | View Log | Download | 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. 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(struct gl_context *ctx, GLenum target,
  47.                           void *mem_ctx);
  48.  
  49.    /* Callers of this ralloc-based new need not call delete. It's
  50.     * easier to just ralloc_free 'ctx' (or any of its ancestors). */
  51.    static void* operator new(size_t size, void *ctx)
  52.    {
  53.       void *mem = rzalloc_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.     * ralloc_free in that case. */
  61.    static void operator delete(void *mem)
  62.    {
  63.       ralloc_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.    const char *version_string;
  73.    enum _mesa_glsl_parser_targets target;
  74.  
  75.    /**
  76.     * Printable list of GLSL versions supported by the current context
  77.     *
  78.     * \note
  79.     * This string should probably be generated per-context instead of per
  80.     * invokation of the compiler.  This should be changed when the method of
  81.     * tracking supported GLSL versions changes.
  82.     */
  83.    const char *supported_version_string;
  84.  
  85.    /**
  86.     * Implementation defined limits that affect built-in variables, etc.
  87.     *
  88.     * \sa struct gl_constants (in mtypes.h)
  89.     */
  90.    struct {
  91.       /* 1.10 */
  92.       unsigned MaxLights;
  93.       unsigned MaxClipPlanes;
  94.       unsigned MaxTextureUnits;
  95.       unsigned MaxTextureCoords;
  96.       unsigned MaxVertexAttribs;
  97.       unsigned MaxVertexUniformComponents;
  98.       unsigned MaxVaryingFloats;
  99.       unsigned MaxVertexTextureImageUnits;
  100.       unsigned MaxCombinedTextureImageUnits;
  101.       unsigned MaxTextureImageUnits;
  102.       unsigned MaxFragmentUniformComponents;
  103.  
  104.       /* ARB_draw_buffers */
  105.       unsigned MaxDrawBuffers;
  106.  
  107.       /**
  108.        * Set of GLSL versions supported by the current context
  109.        *
  110.        * Knowing that version X is supported doesn't mean that versions before
  111.        * X are also supported.  Version 1.00 is only supported in an ES2
  112.        * context or when GL_ARB_ES2_compatibility is supported.  In an OpenGL
  113.        * 3.0 "forward compatible" context, GLSL 1.10 and 1.20 are \b not
  114.        * supported.
  115.        */
  116.       /*@{*/
  117.       unsigned GLSL_100ES:1;
  118.       unsigned GLSL_110:1;
  119.       unsigned GLSL_120:1;
  120.       unsigned GLSL_130:1;
  121.       /*@}*/
  122.    } Const;
  123.  
  124.    /**
  125.     * During AST to IR conversion, pointer to current IR function
  126.     *
  127.     * Will be \c NULL whenever the AST to IR conversion is not inside a
  128.     * function definition.
  129.     */
  130.    class ir_function_signature *current_function;
  131.  
  132.    /** Have we found a return statement in this function? */
  133.    bool found_return;
  134.  
  135.    /** Was there an error during compilation? */
  136.    bool error;
  137.  
  138.    /**
  139.     * Are all shader inputs / outputs invariant?
  140.     *
  141.     * This is set when the 'STDGL invariant(all)' pragma is used.
  142.     */
  143.    bool all_invariant;
  144.  
  145.    /** Loop or switch statement containing the current instructions. */
  146.    class ir_instruction *loop_or_switch_nesting;
  147.    class ast_iteration_statement *loop_or_switch_nesting_ast;
  148.  
  149.    /** List of structures defined in user code. */
  150.    const glsl_type **user_structures;
  151.    unsigned num_user_structures;
  152.  
  153.    char *info_log;
  154.  
  155.    /**
  156.     * \name Enable bits for GLSL extensions
  157.     */
  158.    /*@{*/
  159.    unsigned ARB_draw_buffers_enable:1;
  160.    unsigned ARB_draw_buffers_warn:1;
  161.    unsigned ARB_explicit_attrib_location_enable:1;
  162.    unsigned ARB_explicit_attrib_location_warn:1;
  163.    unsigned ARB_fragment_coord_conventions_enable:1;
  164.    unsigned ARB_fragment_coord_conventions_warn:1;
  165.    unsigned ARB_texture_rectangle_enable:1;
  166.    unsigned ARB_texture_rectangle_warn:1;
  167.    unsigned EXT_texture_array_enable:1;
  168.    unsigned EXT_texture_array_warn:1;
  169.    unsigned ARB_shader_stencil_export_enable:1;
  170.    unsigned ARB_shader_stencil_export_warn:1;
  171.    /*@}*/
  172.  
  173.    /** Extensions supported by the OpenGL implementation. */
  174.    const struct gl_extensions *extensions;
  175.  
  176.    /** Shaders containing built-in functions that are used for linking. */
  177.    struct gl_shader *builtins_to_link[16];
  178.    unsigned num_builtins_to_link;
  179. };
  180.  
  181. typedef struct YYLTYPE {
  182.    int first_line;
  183.    int first_column;
  184.    int last_line;
  185.    int last_column;
  186.    unsigned source;
  187. } YYLTYPE;
  188. # define YYLTYPE_IS_DECLARED 1
  189. # define YYLTYPE_IS_TRIVIAL 1
  190.  
  191. # define YYLLOC_DEFAULT(Current, Rhs, N)                        \
  192. do {                                                            \
  193.    if (N)                                                       \
  194.    {                                                            \
  195.       (Current).first_line   = YYRHSLOC(Rhs, 1).first_line;     \
  196.       (Current).first_column = YYRHSLOC(Rhs, 1).first_column;   \
  197.       (Current).last_line    = YYRHSLOC(Rhs, N).last_line;      \
  198.       (Current).last_column  = YYRHSLOC(Rhs, N).last_column;    \
  199.    }                                                            \
  200.    else                                                         \
  201.    {                                                            \
  202.       (Current).first_line   = (Current).last_line =            \
  203.          YYRHSLOC(Rhs, 0).last_line;                            \
  204.       (Current).first_column = (Current).last_column =          \
  205.          YYRHSLOC(Rhs, 0).last_column;                          \
  206.    }                                                            \
  207.    (Current).source = 0;                                        \
  208. } while (0)
  209.  
  210. extern void _mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state,
  211.                              const char *fmt, ...);
  212.  
  213. /**
  214.  * Emit a warning to the shader log
  215.  *
  216.  * \sa _mesa_glsl_error
  217.  */
  218. extern void _mesa_glsl_warning(const YYLTYPE *locp,
  219.                                _mesa_glsl_parse_state *state,
  220.                                const char *fmt, ...);
  221.  
  222. extern void _mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state,
  223.                                   const char *string);
  224.  
  225. extern void _mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state);
  226.  
  227. union YYSTYPE;
  228. extern int _mesa_glsl_lex(union YYSTYPE *yylval, YYLTYPE *yylloc,
  229.                           void *scanner);
  230.  
  231. extern int _mesa_glsl_parse(struct _mesa_glsl_parse_state *);
  232.  
  233. /**
  234.  * Process elements of the #extension directive
  235.  *
  236.  * \return
  237.  * If \c name and \c behavior are valid, \c true is returned.  Otherwise
  238.  * \c false is returned.
  239.  */
  240. extern bool _mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp,
  241.                                          const char *behavior,
  242.                                          YYLTYPE *behavior_locp,
  243.                                          _mesa_glsl_parse_state *state);
  244.  
  245. /**
  246.  * Get the textual name of the specified shader target
  247.  */
  248. extern const char *
  249. _mesa_glsl_shader_target_name(enum _mesa_glsl_parser_targets target);
  250.  
  251.  
  252. #endif /* __cplusplus */
  253.  
  254.  
  255. /*
  256.  * These definitions apply to C and C++
  257.  */
  258. #ifdef __cplusplus
  259. extern "C" {
  260. #endif
  261.  
  262. extern int preprocess(void *ctx, const char **shader, char **info_log,
  263.                       const struct gl_extensions *extensions, int api);
  264.  
  265. extern void _mesa_destroy_shader_compiler();
  266. extern void _mesa_destroy_shader_compiler_caches();
  267.  
  268. #ifdef __cplusplus
  269. }
  270. #endif
  271.  
  272.  
  273. #endif /* GLSL_PARSER_EXTRAS_H */
  274.