glsl_parser_extras.h revision c824804c6f10eeb58ae91033682ca871c0e373c4
1ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 2ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Copyright © 2010 Intel Corporation 3ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 4436e89c602e787e7a27dd6624b09beed41a0da8aDmitriy Ivanov * Permission is hereby granted, free of charge, to any person obtaining a 5ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * copy of this software and associated documentation files (the "Software"), 6ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * to deal in the Software without restriction, including without limitation 7ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * the rights to use, copy, modify, merge, publish, distribute, sublicense, 8ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * and/or sell copies of the Software, and to permit persons to whom the 9ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Software is furnished to do so, subject to the following conditions: 10ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 11ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * The above copyright notice and this permission notice (including the next 12ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * paragraph) shall be included in all copies or substantial portions of the 13ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Software. 14ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 15ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 18ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 20ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 21ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * DEALINGS IN THE SOFTWARE. 22ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 23ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 24ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#pragma once 25ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifndef GLSL_PARSER_EXTRAS_H 26ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#define GLSL_PARSER_EXTRAS_H 27ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 28ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 29ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Most of the definitions here only apply to C++ 30ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 31ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __cplusplus 32ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 33ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 34ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include <stdlib.h> 35ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#include "glsl_symbol_table.h" 36ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 37ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownenum _mesa_glsl_parser_targets { 38ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown vertex_shader, 39ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown geometry_shader, 40ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown fragment_shader 41ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 42ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 43ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct gl_context; 44ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 45ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownstruct glsl_switch_state { 46ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** Temporary variables needed for switch statement. */ 47ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ir_variable *test_var; 48663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng ir_variable *is_fallthru_var; 49ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ir_variable *is_break_var; 50ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown class ast_switch_statement *switch_nesting_ast; 51ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 52ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** Table of constant values already used in case labels */ 53ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct hash_table *labels_ht; 54ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown class ast_case_label *previous_default; 55ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 56663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng bool is_switch_innermost; // if switch stmt is closest to break, ... 57663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng}; 58663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 59663860b1408516d02ebfcb3a9999a134e6cfb223Ben Chengstruct _mesa_glsl_parse_state { 60663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng _mesa_glsl_parse_state(struct gl_context *_ctx, GLenum target, 61663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void *mem_ctx); 62663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 63663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng /* Callers of this ralloc-based new need not call delete. It's 64663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng * easier to just ralloc_free 'ctx' (or any of its ancestors). */ 65663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng static void* operator new(size_t size, void *ctx) 66663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng { 67663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng void *mem = rzalloc_size(ctx, size); 68663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng assert(mem != NULL); 69663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng 70663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng return mem; 71ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 72ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 73ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* If the user *does* call delete, that's OK, we will just 74ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * ralloc_free in that case. */ 75ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown static void operator delete(void *mem) 76ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { 77ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown ralloc_free(mem); 78ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } 79ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 80ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct gl_context *const ctx; 81ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void *scanner; 82ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exec_list translation_unit; 83ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown glsl_symbol_table *symbols; 84ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 85ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned num_uniform_blocks; 86ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned uniform_block_array_size; 87ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct gl_uniform_block *uniform_blocks; 88ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 89ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool es_shader; 90ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned language_version; 91ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const char *version_string; 92ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown enum _mesa_glsl_parser_targets target; 93ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 94ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** 95ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Default uniform layout qualifiers tracked during parsing. 96ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Currently affects uniform blocks and uniform buffer variables in 97ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * those blocks. 98ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 99ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct ast_type_qualifier *default_uniform_qualifier; 100ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 101ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** 102ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Printable list of GLSL versions supported by the current context 103ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 104ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * \note 105ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * This string should probably be generated per-context instead of per 106ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * invokation of the compiler. This should be changed when the method of 107ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * tracking supported GLSL versions changes. 108ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 109663860b1408516d02ebfcb3a9999a134e6cfb223Ben Cheng const char *supported_version_string; 110ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 111ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** 112ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Implementation defined limits that affect built-in variables, etc. 113ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 114ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * \sa struct gl_constants (in mtypes.h) 115ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 116ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct { 117ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* 1.10 */ 118ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned MaxLights; 119ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned MaxClipPlanes; 120ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned MaxTextureUnits; 121ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned MaxTextureCoords; 122ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned MaxVertexAttribs; 123ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned MaxVertexUniformComponents; 124ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned MaxVaryingFloats; 125ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned MaxVertexTextureImageUnits; 126ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned MaxCombinedTextureImageUnits; 127ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned MaxTextureImageUnits; 128ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned MaxFragmentUniformComponents; 129ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 130ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /* ARB_draw_buffers */ 131ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned MaxDrawBuffers; 132ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } Const; 133ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 134ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** 135ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * During AST to IR conversion, pointer to current IR function 136ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 137ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Will be \c NULL whenever the AST to IR conversion is not inside a 138ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * function definition. 139ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 140ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown class ir_function_signature *current_function; 141ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 142ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** 143ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * During AST to IR conversion, pointer to the toplevel IR 144ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * instruction list being generated. 145ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 146ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown exec_list *toplevel_ir; 147ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 148ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** Have we found a return statement in this function? */ 149ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool found_return; 150ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 151ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** Was there an error during compilation? */ 152ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool error; 153ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 154ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** 155ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Are all shader inputs / outputs invariant? 156ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 157ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * This is set when the 'STDGL invariant(all)' pragma is used. 158ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 159ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool all_invariant; 160ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 161ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** Loop or switch statement containing the current instructions. */ 162ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown class ast_iteration_statement *loop_nesting_ast; 163ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 164ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct glsl_switch_state switch_state; 165ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 166ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** List of structures defined in user code. */ 167ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const glsl_type **user_structures; 168ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned num_user_structures; 169ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 170ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown char *info_log; 171ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 172ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** 173ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * \name Enable bits for GLSL extensions 174ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 175ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /*@{*/ 176ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_draw_buffers_enable; 177ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_draw_buffers_warn; 178ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_draw_instanced_enable; 179ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_draw_instanced_warn; 180ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_explicit_attrib_location_enable; 181ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_explicit_attrib_location_warn; 182ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_fragment_coord_conventions_enable; 183ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_fragment_coord_conventions_warn; 184ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_texture_rectangle_enable; 185ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_texture_rectangle_warn; 186ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool EXT_texture_array_enable; 187ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool EXT_texture_array_warn; 188ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_shader_texture_lod_enable; 189ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_shader_texture_lod_warn; 190ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_shader_stencil_export_enable; 191ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_shader_stencil_export_warn; 192ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool AMD_conservative_depth_enable; 193ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool AMD_conservative_depth_warn; 194ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_conservative_depth_enable; 195ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_conservative_depth_warn; 196ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool AMD_shader_stencil_export_enable; 197ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool AMD_shader_stencil_export_warn; 198ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool OES_texture_3D_enable; 199ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool OES_texture_3D_warn; 200ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool OES_EGL_image_external_enable; 201ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool OES_EGL_image_external_warn; 202ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_shader_bit_encoding_enable; 203ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_shader_bit_encoding_warn; 204ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_uniform_buffer_object_enable; 205ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool ARB_uniform_buffer_object_warn; 206ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool OES_standard_derivatives_enable; 207ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown bool OES_standard_derivatives_warn; 208ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /*@}*/ 209ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 210ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** Extensions supported by the OpenGL implementation. */ 211ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const struct gl_extensions *extensions; 212ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 213ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown /** Shaders containing built-in functions that are used for linking. */ 214ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown struct gl_shader *builtins_to_link[16]; 215ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned num_builtins_to_link; 216ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown}; 217ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 218ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browntypedef struct YYLTYPE { 219ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int first_line; 220ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int first_column; 221ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int last_line; 222ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown int last_column; 223ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown unsigned source; 224ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} YYLTYPE; 225ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define YYLTYPE_IS_DECLARED 1 226ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define YYLTYPE_IS_TRIVIAL 1 227ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 228ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown# define YYLLOC_DEFAULT(Current, Rhs, N) \ 229ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Browndo { \ 230ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown if (N) \ 231ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { \ 232ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Current).first_line = YYRHSLOC(Rhs, 1).first_line; \ 233ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Current).first_column = YYRHSLOC(Rhs, 1).first_column; \ 234ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Current).last_line = YYRHSLOC(Rhs, N).last_line; \ 235ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Current).last_column = YYRHSLOC(Rhs, N).last_column; \ 236ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } \ 237ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown else \ 238ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown { \ 239ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Current).first_line = (Current).last_line = \ 240ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown YYRHSLOC(Rhs, 0).last_line; \ 241ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Current).first_column = (Current).last_column = \ 242ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown YYRHSLOC(Rhs, 0).last_column; \ 243ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown } \ 244ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown (Current).source = 0; \ 245ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} while (0) 246ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 247ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void _mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state, 248ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const char *fmt, ...); 249ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 250ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** 251ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Emit a warning to the shader log 252ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 253ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * \sa _mesa_glsl_error 254ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 255ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void _mesa_glsl_warning(const YYLTYPE *locp, 256ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown _mesa_glsl_parse_state *state, 257ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const char *fmt, ...); 258ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 259ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void _mesa_glsl_lexer_ctor(struct _mesa_glsl_parse_state *state, 260ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const char *string); 261ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 262ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void _mesa_glsl_lexer_dtor(struct _mesa_glsl_parse_state *state); 263ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 264ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownunion YYSTYPE; 265ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int _mesa_glsl_lex(union YYSTYPE *yylval, YYLTYPE *yylloc, 266ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown void *scanner); 267ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 268ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int _mesa_glsl_parse(struct _mesa_glsl_parse_state *); 269ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 270ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** 271ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Process elements of the #extension directive 272ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * 273ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * \return 274ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * If \c name and \c behavior are valid, \c true is returned. Otherwise 275ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * \c false is returned. 276ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 277ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern bool _mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp, 278ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const char *behavior, 279ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown YYLTYPE *behavior_locp, 280ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown _mesa_glsl_parse_state *state); 281ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 282ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/** 283ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * Get the textual name of the specified shader target 284ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 285ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern const char * 286ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown_mesa_glsl_shader_target_name(enum _mesa_glsl_parser_targets target); 287ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 288ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 289ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* __cplusplus */ 290ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 291ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 292ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown/* 293ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown * These definitions apply to C and C++ 294ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown */ 295ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __cplusplus 296ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern "C" { 297ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 298ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 299ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern int preprocess(void *ctx, const char **shader, char **info_log, 300ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown const struct gl_extensions *extensions, int api); 301ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 302ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void _mesa_destroy_shader_compiler(void); 303ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brownextern void _mesa_destroy_shader_compiler_caches(void); 304ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 305ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#ifdef __cplusplus 306ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown} 307ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif 308ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 309ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown 310ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown#endif /* GLSL_PARSER_EXTRAS_H */ 311ed07e00d438c74b7a23c01bfffde77e3968305e4Jeff Brown