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