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 37enum _mesa_glsl_parser_targets { 38 vertex_shader, 39 geometry_shader, 40 fragment_shader 41}; 42 43struct gl_context; 44 45struct 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 59struct _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). */ 65 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. */ 75 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 218typedef 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) \ 229do { \ 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 247extern 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 */ 255extern void _mesa_glsl_warning(const YYLTYPE *locp, 256 _mesa_glsl_parse_state *state, 257 const char *fmt, ...); 258 259extern void _mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state, 260 const char *string); 261 262extern void _mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state); 263 264union YYSTYPE; 265extern int _mesa_glsl_lex(union YYSTYPE *yylval, YYLTYPE *yylloc, 266 void *scanner); 267 268extern 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 */ 277extern 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 */ 285extern 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 296extern "C" { 297#endif 298 299extern int glcpp_preprocess(void *ctx, const char **shader, char **info_log, 300 const struct gl_extensions *extensions, int api); 301 302extern void _mesa_destroy_shader_compiler(void); 303extern void _mesa_destroy_shader_compiler_caches(void); 304 305#ifdef __cplusplus 306} 307#endif 308 309 310#endif /* GLSL_PARSER_EXTRAS_H */ 311