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
37enum _mesa_glsl_parser_targets {
38   vertex_shader,
39   geometry_shader,
40   fragment_shader
41};
42
43struct gl_context;
44
45struct _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
147typedef 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)			\
158do {								\
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
176extern 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 */
184extern void _mesa_glsl_warning(const YYLTYPE *locp,
185			       _mesa_glsl_parse_state *state,
186			       const char *fmt, ...);
187
188extern void _mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state,
189				  const char *string);
190
191extern void _mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state);
192
193union YYSTYPE;
194extern int _mesa_glsl_lex(union YYSTYPE *yylval, YYLTYPE *yylloc,
195			  void *scanner);
196
197extern 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 */
206extern 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 */
214extern 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
225extern "C" {
226#endif
227
228extern int preprocess(void *ctx, const char **shader, char **info_log,
229                      const struct gl_extensions *extensions, int api);
230
231extern void _mesa_destroy_shader_compiler();
232extern void _mesa_destroy_shader_compiler_caches();
233
234#ifdef __cplusplus
235}
236#endif
237
238
239#endif /* GLSL_PARSER_EXTRAS_H */
240