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 glsl_switch_state { 46 /** Temporary variables needed for switch statement. */ 47 ir_variable *test_var; 48 ir_variable *is_fallthru_var; 49 ir_variable *is_break_var; 50 class ast_switch_statement *switch_nesting_ast; 51 52 /** Table of constant values already used in case labels */ 53 struct hash_table *labels_ht; 54 class ast_case_label *previous_default; 55 56 bool is_switch_innermost; // if switch stmt is closest to break, ... 57 }; 58 59 struct _mesa_glsl_parse_state { 60 _mesa_glsl_parse_state(struct gl_context *_ctx, GLenum target, 61 void *mem_ctx); 62 63 /* Callers of this ralloc-based new need not call delete. It's 64 * easier to just ralloc_free 'ctx' (or any of its ancestors). */ new_mesa_glsl_parse_state65 static void* operator new(size_t size, void *ctx) 66 { 67 void *mem = rzalloc_size(ctx, size); 68 assert(mem != NULL); 69 70 return mem; 71 } 72 73 /* If the user *does* call delete, that's OK, we will just 74 * ralloc_free in that case. */ delete_mesa_glsl_parse_state75 static void operator delete(void *mem) 76 { 77 ralloc_free(mem); 78 } 79 80 struct gl_context *const ctx; 81 void *scanner; 82 exec_list translation_unit; 83 glsl_symbol_table *symbols; 84 85 unsigned num_uniform_blocks; 86 unsigned uniform_block_array_size; 87 struct gl_uniform_block *uniform_blocks; 88 89 bool es_shader; 90 unsigned language_version; 91 const char *version_string; 92 enum _mesa_glsl_parser_targets target; 93 94 /** 95 * Default uniform layout qualifiers tracked during parsing. 96 * Currently affects uniform blocks and uniform buffer variables in 97 * those blocks. 98 */ 99 struct ast_type_qualifier *default_uniform_qualifier; 100 101 /** 102 * Printable list of GLSL versions supported by the current context 103 * 104 * \note 105 * This string should probably be generated per-context instead of per 106 * invokation of the compiler. This should be changed when the method of 107 * tracking supported GLSL versions changes. 108 */ 109 const char *supported_version_string; 110 111 /** 112 * Implementation defined limits that affect built-in variables, etc. 113 * 114 * \sa struct gl_constants (in mtypes.h) 115 */ 116 struct { 117 /* 1.10 */ 118 unsigned MaxLights; 119 unsigned MaxClipPlanes; 120 unsigned MaxTextureUnits; 121 unsigned MaxTextureCoords; 122 unsigned MaxVertexAttribs; 123 unsigned MaxVertexUniformComponents; 124 unsigned MaxVaryingFloats; 125 unsigned MaxVertexTextureImageUnits; 126 unsigned MaxCombinedTextureImageUnits; 127 unsigned MaxTextureImageUnits; 128 unsigned MaxFragmentUniformComponents; 129 130 /* ARB_draw_buffers */ 131 unsigned MaxDrawBuffers; 132 } Const; 133 134 /** 135 * During AST to IR conversion, pointer to current IR function 136 * 137 * Will be \c NULL whenever the AST to IR conversion is not inside a 138 * function definition. 139 */ 140 class ir_function_signature *current_function; 141 142 /** 143 * During AST to IR conversion, pointer to the toplevel IR 144 * instruction list being generated. 145 */ 146 exec_list *toplevel_ir; 147 148 /** Have we found a return statement in this function? */ 149 bool found_return; 150 151 /** Was there an error during compilation? */ 152 bool error; 153 154 /** 155 * Are all shader inputs / outputs invariant? 156 * 157 * This is set when the 'STDGL invariant(all)' pragma is used. 158 */ 159 bool all_invariant; 160 161 /** Loop or switch statement containing the current instructions. */ 162 class ast_iteration_statement *loop_nesting_ast; 163 164 struct glsl_switch_state switch_state; 165 166 /** List of structures defined in user code. */ 167 const glsl_type **user_structures; 168 unsigned num_user_structures; 169 170 char *info_log; 171 172 /** 173 * \name Enable bits for GLSL extensions 174 */ 175 /*@{*/ 176 bool ARB_draw_buffers_enable; 177 bool ARB_draw_buffers_warn; 178 bool ARB_draw_instanced_enable; 179 bool ARB_draw_instanced_warn; 180 bool ARB_explicit_attrib_location_enable; 181 bool ARB_explicit_attrib_location_warn; 182 bool ARB_fragment_coord_conventions_enable; 183 bool ARB_fragment_coord_conventions_warn; 184 bool ARB_texture_rectangle_enable; 185 bool ARB_texture_rectangle_warn; 186 bool EXT_texture_array_enable; 187 bool EXT_texture_array_warn; 188 bool ARB_shader_texture_lod_enable; 189 bool ARB_shader_texture_lod_warn; 190 bool ARB_shader_stencil_export_enable; 191 bool ARB_shader_stencil_export_warn; 192 bool AMD_conservative_depth_enable; 193 bool AMD_conservative_depth_warn; 194 bool ARB_conservative_depth_enable; 195 bool ARB_conservative_depth_warn; 196 bool AMD_shader_stencil_export_enable; 197 bool AMD_shader_stencil_export_warn; 198 bool OES_texture_3D_enable; 199 bool OES_texture_3D_warn; 200 bool OES_EGL_image_external_enable; 201 bool OES_EGL_image_external_warn; 202 bool ARB_shader_bit_encoding_enable; 203 bool ARB_shader_bit_encoding_warn; 204 bool ARB_uniform_buffer_object_enable; 205 bool ARB_uniform_buffer_object_warn; 206 bool OES_standard_derivatives_enable; 207 bool OES_standard_derivatives_warn; 208 /*@}*/ 209 210 /** Extensions supported by the OpenGL implementation. */ 211 const struct gl_extensions *extensions; 212 213 /** Shaders containing built-in functions that are used for linking. */ 214 struct gl_shader *builtins_to_link[16]; 215 unsigned num_builtins_to_link; 216 }; 217 218 typedef struct YYLTYPE { 219 int first_line; 220 int first_column; 221 int last_line; 222 int last_column; 223 unsigned source; 224 } YYLTYPE; 225 # define YYLTYPE_IS_DECLARED 1 226 # define YYLTYPE_IS_TRIVIAL 1 227 228 # define YYLLOC_DEFAULT(Current, Rhs, N) \ 229 do { \ 230 if (N) \ 231 { \ 232 (Current).first_line = YYRHSLOC(Rhs, 1).first_line; \ 233 (Current).first_column = YYRHSLOC(Rhs, 1).first_column; \ 234 (Current).last_line = YYRHSLOC(Rhs, N).last_line; \ 235 (Current).last_column = YYRHSLOC(Rhs, N).last_column; \ 236 } \ 237 else \ 238 { \ 239 (Current).first_line = (Current).last_line = \ 240 YYRHSLOC(Rhs, 0).last_line; \ 241 (Current).first_column = (Current).last_column = \ 242 YYRHSLOC(Rhs, 0).last_column; \ 243 } \ 244 (Current).source = 0; \ 245 } while (0) 246 247 extern void _mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state, 248 const char *fmt, ...); 249 250 /** 251 * Emit a warning to the shader log 252 * 253 * \sa _mesa_glsl_error 254 */ 255 extern void _mesa_glsl_warning(const YYLTYPE *locp, 256 _mesa_glsl_parse_state *state, 257 const char *fmt, ...); 258 259 extern void _mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state, 260 const char *string); 261 262 extern void _mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state); 263 264 union YYSTYPE; 265 extern int _mesa_glsl_lex(union YYSTYPE *yylval, YYLTYPE *yylloc, 266 void *scanner); 267 268 extern int _mesa_glsl_parse(struct _mesa_glsl_parse_state *); 269 270 /** 271 * Process elements of the #extension directive 272 * 273 * \return 274 * If \c name and \c behavior are valid, \c true is returned. Otherwise 275 * \c false is returned. 276 */ 277 extern bool _mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp, 278 const char *behavior, 279 YYLTYPE *behavior_locp, 280 _mesa_glsl_parse_state *state); 281 282 /** 283 * Get the textual name of the specified shader target 284 */ 285 extern const char * 286 _mesa_glsl_shader_target_name(enum _mesa_glsl_parser_targets target); 287 288 289 #endif /* __cplusplus */ 290 291 292 /* 293 * These definitions apply to C and C++ 294 */ 295 #ifdef __cplusplus 296 extern "C" { 297 #endif 298 299 extern int glcpp_preprocess(void *ctx, const char **shader, char **info_log, 300 const struct gl_extensions *extensions, int api); 301 302 extern void _mesa_destroy_shader_compiler(void); 303 extern void _mesa_destroy_shader_compiler_caches(void); 304 305 #ifdef __cplusplus 306 } 307 #endif 308 309 310 #endif /* GLSL_PARSER_EXTRAS_H */ 311