1a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick/*
2a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Copyright © 2008, 2009 Intel Corporation
3a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
4a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Permission is hereby granted, free of charge, to any person obtaining a
5a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * copy of this software and associated documentation files (the "Software"),
6a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * to deal in the Software without restriction, including without limitation
7a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * the rights to use, copy, modify, merge, publish, distribute, sublicense,
8a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * and/or sell copies of the Software, and to permit persons to whom the
9a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software is furnished to do so, subject to the following conditions:
10a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
11a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * The above copyright notice and this permission notice (including the next
12a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * paragraph) shall be included in all copies or substantial portions of the
13a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * Software.
14a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick *
15a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
18a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
20a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
21a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick * DEALINGS IN THE SOFTWARE.
22a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick */
23a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include <stdio.h>
24a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include <stdarg.h>
25a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include <string.h>
26a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include <assert.h>
27a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
28b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunkeextern "C" {
29f9995b30756140724f41daf963fa06167912be7fKristian Høgsberg#include "main/core.h" /* for struct gl_context */
304aecd8f0316833348bb6fc392eb1aeea2410a206Jordan Justen#include "main/context.h"
31b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke}
32b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke
33d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke#include "ralloc.h"
34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "ast.h"
35a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_parser_extras.h"
36d59673c9de9f14e6aefcdb0b06751d935385c4aaIan Romanick#include "glsl_parser.h"
372f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt#include "ir_optimization.h"
388df2dbf91ddfd0c1590e33015e85470b67e69319Ian Romanick#include "loop_analysis.h"
39a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
408c99906cf5c8825ada0699f61926864e568ca69aDylan Noblesmith_mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
412462a536ea5c98867296905e3da127eba7c7bdffIan Romanick					       GLenum target, void *mem_ctx)
428c99906cf5c8825ada0699f61926864e568ca69aDylan Noblesmith : ctx(_ctx)
432462a536ea5c98867296905e3da127eba7c7bdffIan Romanick{
442462a536ea5c98867296905e3da127eba7c7bdffIan Romanick   switch (target) {
452462a536ea5c98867296905e3da127eba7c7bdffIan Romanick   case GL_VERTEX_SHADER:   this->target = vertex_shader; break;
462462a536ea5c98867296905e3da127eba7c7bdffIan Romanick   case GL_FRAGMENT_SHADER: this->target = fragment_shader; break;
472462a536ea5c98867296905e3da127eba7c7bdffIan Romanick   case GL_GEOMETRY_SHADER: this->target = geometry_shader; break;
482462a536ea5c98867296905e3da127eba7c7bdffIan Romanick   }
492462a536ea5c98867296905e3da127eba7c7bdffIan Romanick
502462a536ea5c98867296905e3da127eba7c7bdffIan Romanick   this->scanner = NULL;
512462a536ea5c98867296905e3da127eba7c7bdffIan Romanick   this->translation_unit.make_empty();
522462a536ea5c98867296905e3da127eba7c7bdffIan Romanick   this->symbols = new(mem_ctx) glsl_symbol_table;
53d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke   this->info_log = ralloc_strdup(mem_ctx, "");
542462a536ea5c98867296905e3da127eba7c7bdffIan Romanick   this->error = false;
555c02e2e2de75b9d18ca25b4f1cba38c4a89c5bd0Dan McCabe   this->loop_nesting_ast = NULL;
5622d81f154fed9e004cca91807808ae3b81b01cedEric Anholt   this->switch_state.switch_nesting_ast = NULL;
57814c89abdbcd5b841b98746af921796df0362238Kenneth Graunke
580fabf8e8dc96a0eb8a9fbbac760d4faceee3af48Kenneth Graunke   this->num_builtins_to_link = 0;
590fabf8e8dc96a0eb8a9fbbac760d4faceee3af48Kenneth Graunke
60814c89abdbcd5b841b98746af921796df0362238Kenneth Graunke   /* Set default language version and extensions */
61814c89abdbcd5b841b98746af921796df0362238Kenneth Graunke   this->language_version = 110;
62719caa403ecc3345b86708f8172600d80132d6cbKenneth Graunke   this->es_shader = false;
632462a536ea5c98867296905e3da127eba7c7bdffIan Romanick   this->ARB_texture_rectangle_enable = true;
642462a536ea5c98867296905e3da127eba7c7bdffIan Romanick
65dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu   /* OpenGL ES 2.0 has different defaults from desktop GL. */
66dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu   if (ctx->API == API_OPENGLES2) {
67dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu      this->language_version = 100;
68dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu      this->es_shader = true;
69dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu      this->ARB_texture_rectangle_enable = false;
702462a536ea5c98867296905e3da127eba7c7bdffIan Romanick   }
71dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu
72dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu   this->extensions = &ctx->Extensions;
73dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu
74dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu   this->Const.MaxLights = ctx->Const.MaxLights;
75dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu   this->Const.MaxClipPlanes = ctx->Const.MaxClipPlanes;
76dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu   this->Const.MaxTextureUnits = ctx->Const.MaxTextureUnits;
77dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu   this->Const.MaxTextureCoords = ctx->Const.MaxTextureCoordUnits;
78dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu   this->Const.MaxVertexAttribs = ctx->Const.VertexProgram.MaxAttribs;
79dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu   this->Const.MaxVertexUniformComponents = ctx->Const.VertexProgram.MaxUniformComponents;
80dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu   this->Const.MaxVaryingFloats = ctx->Const.MaxVarying * 4;
81dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu   this->Const.MaxVertexTextureImageUnits = ctx->Const.MaxVertexTextureImageUnits;
82dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu   this->Const.MaxCombinedTextureImageUnits = ctx->Const.MaxCombinedTextureImageUnits;
83dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu   this->Const.MaxTextureImageUnits = ctx->Const.MaxTextureImageUnits;
84dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu   this->Const.MaxFragmentUniformComponents = ctx->Const.FragmentProgram.MaxUniformComponents;
85dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu
86dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu   this->Const.MaxDrawBuffers = ctx->Const.MaxDrawBuffers;
8714880a510a1a288df0778395097d5a52806abfb0Ian Romanick
8814880a510a1a288df0778395097d5a52806abfb0Ian Romanick   const unsigned lowest_version =
8914880a510a1a288df0778395097d5a52806abfb0Ian Romanick      (ctx->API == API_OPENGLES2) || ctx->Extensions.ARB_ES2_compatibility
9014880a510a1a288df0778395097d5a52806abfb0Ian Romanick      ? 100 : 110;
9114880a510a1a288df0778395097d5a52806abfb0Ian Romanick   const unsigned highest_version =
923a90dc22d1c74e8719c95221f15043e7f3e69286Kenneth Graunke      _mesa_is_desktop_gl(ctx) ? ctx->Const.GLSLVersion : 100;
93a7d350790b4d0416117bc785aa77de52e9298a01Kenneth Graunke   char *supported = ralloc_strdup(this, "");
9414880a510a1a288df0778395097d5a52806abfb0Ian Romanick
9514880a510a1a288df0778395097d5a52806abfb0Ian Romanick   for (unsigned ver = lowest_version; ver <= highest_version; ver += 10) {
9614880a510a1a288df0778395097d5a52806abfb0Ian Romanick      const char *const prefix = (ver == lowest_version)
9714880a510a1a288df0778395097d5a52806abfb0Ian Romanick	 ? ""
9814880a510a1a288df0778395097d5a52806abfb0Ian Romanick	 : ((ver == highest_version) ? ", and " : ", ");
9914880a510a1a288df0778395097d5a52806abfb0Ian Romanick
10014880a510a1a288df0778395097d5a52806abfb0Ian Romanick      ralloc_asprintf_append(& supported, "%s%d.%02d%s",
10114880a510a1a288df0778395097d5a52806abfb0Ian Romanick			     prefix,
10214880a510a1a288df0778395097d5a52806abfb0Ian Romanick			     ver / 100, ver % 100,
10314880a510a1a288df0778395097d5a52806abfb0Ian Romanick			     (ver == 100) ? " ES" : "");
10414880a510a1a288df0778395097d5a52806abfb0Ian Romanick   }
10514880a510a1a288df0778395097d5a52806abfb0Ian Romanick
10614880a510a1a288df0778395097d5a52806abfb0Ian Romanick   this->supported_version_string = supported;
107b9e27cc1426e3242a003fa5ae91fab330694009aEric Anholt
108b9e27cc1426e3242a003fa5ae91fab330694009aEric Anholt   if (ctx->Const.ForceGLSLExtensionsWarn)
109b9e27cc1426e3242a003fa5ae91fab330694009aEric Anholt      _mesa_glsl_process_extension("all", NULL, "warn", NULL, this);
110551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt
111551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt   this->default_uniform_qualifier = new(this) ast_type_qualifier();
112551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt   this->default_uniform_qualifier->flags.q.shared = 1;
113551bdf25bc4e57bea51c54da7e31c44c507e6c9fEric Anholt   this->default_uniform_qualifier->flags.q.column_major = 1;
1142462a536ea5c98867296905e3da127eba7c7bdffIan Romanick}
1152462a536ea5c98867296905e3da127eba7c7bdffIan Romanick
1165bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanickconst char *
1175bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick_mesa_glsl_shader_target_name(enum _mesa_glsl_parser_targets target)
1185bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick{
1195bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick   switch (target) {
1205bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick   case vertex_shader:   return "vertex";
1215bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick   case fragment_shader: return "fragment";
1225bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick   case geometry_shader: return "geometry";
1235bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick   }
1245bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick
1255bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick   assert(!"Should not get here.");
12687a2ee8db6222006480bd0e0ac58b77795c5d951Eric Anholt   return "unknown";
1275bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick}
1285bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick
12948e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith/* This helper function will append the given message to the shader's
13048e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith   info log and report it via GL_ARB_debug_output. Per that extension,
13148e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith   'type' is one of the enum values classifying the message, and
13248e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith   'id' is the implementation-defined ID of the given message. */
13348e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmithstatic void
13448e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith_mesa_glsl_msg(const YYLTYPE *locp, _mesa_glsl_parse_state *state,
13548e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith               GLenum type, GLuint id, const char *fmt, va_list ap)
13648e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith{
13748e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith   bool error = (type == GL_DEBUG_TYPE_ERROR_ARB);
13848e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith
13948e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith   assert(state->info_log != NULL);
140d5a10dba6464d6cc40b3abcd6b704fb087e1056cDylan Noblesmith
141d5a10dba6464d6cc40b3abcd6b704fb087e1056cDylan Noblesmith   /* Get the offset that the new message will be written to. */
142d5a10dba6464d6cc40b3abcd6b704fb087e1056cDylan Noblesmith   int msg_offset = strlen(state->info_log);
143d5a10dba6464d6cc40b3abcd6b704fb087e1056cDylan Noblesmith
14448e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith   ralloc_asprintf_append(&state->info_log, "%u:%u(%u): %s: ",
14548e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith					    locp->source,
14648e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith					    locp->first_line,
14748e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith					    locp->first_column,
14848e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith					    error ? "error" : "warning");
14948e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith   ralloc_vasprintf_append(&state->info_log, fmt, ap);
150d5a10dba6464d6cc40b3abcd6b704fb087e1056cDylan Noblesmith
151d5a10dba6464d6cc40b3abcd6b704fb087e1056cDylan Noblesmith   const char *const msg = &state->info_log[msg_offset];
152d5a10dba6464d6cc40b3abcd6b704fb087e1056cDylan Noblesmith   struct gl_context *ctx = state->ctx;
153d5a10dba6464d6cc40b3abcd6b704fb087e1056cDylan Noblesmith   /* Report the error via GL_ARB_debug_output. */
154d5a10dba6464d6cc40b3abcd6b704fb087e1056cDylan Noblesmith   if (error)
155d5a10dba6464d6cc40b3abcd6b704fb087e1056cDylan Noblesmith      _mesa_shader_debug(ctx, type, id, msg, strlen(msg));
156d5a10dba6464d6cc40b3abcd6b704fb087e1056cDylan Noblesmith
15748e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith   ralloc_strcat(&state->info_log, "\n");
15848e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith}
1595bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick
160a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
1611f585180597290c7891c43dc0da3c9c06d7cebb1Ian Romanick_mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state,
1621f585180597290c7891c43dc0da3c9c06d7cebb1Ian Romanick		 const char *fmt, ...)
163a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
164a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   va_list ap;
16548e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith   GLenum type = GL_DEBUG_TYPE_ERROR_ARB;
166a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
16771d0bbfcb2853f37b580ec7b705e55bb0eb426faIan Romanick   state->error = true;
1681f585180597290c7891c43dc0da3c9c06d7cebb1Ian Romanick
169a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   va_start(ap, fmt);
17048e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith   _mesa_glsl_msg(locp, state, type, SHADER_ERROR_UNKNOWN, fmt, ap);
171a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   va_end(ap);
172a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
173a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
174a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
17556b8b214107a0320c7277cd832480998057f8413Ian Romanickvoid
1763623df68fa9f4db88c436425524bc27c7f59a051Eric Anholt_mesa_glsl_warning(const YYLTYPE *locp, _mesa_glsl_parse_state *state,
17756b8b214107a0320c7277cd832480998057f8413Ian Romanick		   const char *fmt, ...)
17856b8b214107a0320c7277cd832480998057f8413Ian Romanick{
17956b8b214107a0320c7277cd832480998057f8413Ian Romanick   va_list ap;
18048e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith   GLenum type = GL_DEBUG_TYPE_OTHER_ARB;
18156b8b214107a0320c7277cd832480998057f8413Ian Romanick
18256b8b214107a0320c7277cd832480998057f8413Ian Romanick   va_start(ap, fmt);
18348e8a010aebbb40c75698e2aa8854d129c89f359Dylan Noblesmith   _mesa_glsl_msg(locp, state, type, 0, fmt, ap);
18456b8b214107a0320c7277cd832480998057f8413Ian Romanick   va_end(ap);
18556b8b214107a0320c7277cd832480998057f8413Ian Romanick}
18656b8b214107a0320c7277cd832480998057f8413Ian Romanick
18756b8b214107a0320c7277cd832480998057f8413Ian Romanick
1883097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry/**
1893097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry * Enum representing the possible behaviors that can be specified in
1903097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry * an #extension directive.
1913097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry */
1923097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berryenum ext_behavior {
1933097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   extension_disable,
1943097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   extension_enable,
1953097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   extension_require,
1963097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   extension_warn
1973097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry};
1983097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
1993097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry/**
2003097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry * Element type for _mesa_glsl_supported_extensions
2013097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry */
2023097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berrystruct _mesa_glsl_extension {
2033097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   /**
2043097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * Name of the extension when referred to in a GLSL extension
2053097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * statement
2063097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    */
2073097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   const char *name;
2083097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
2093097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   /** True if this extension is available to vertex shaders */
2103097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   bool avail_in_VS;
2113097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
2123097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   /** True if this extension is available to geometry shaders */
2133097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   bool avail_in_GS;
2143097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
2153097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   /** True if this extension is available to fragment shaders */
2163097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   bool avail_in_FS;
2173097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
2183097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   /** True if this extension is available to desktop GL shaders */
2193097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   bool avail_in_GL;
2203097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
2213097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   /** True if this extension is available to GLES shaders */
2223097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   bool avail_in_ES;
2233097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
2243097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   /**
2253097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * Flag in the gl_extensions struct indicating whether this
2263097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * extension is supported by the driver, or
2273097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * &gl_extensions::dummy_true if supported by all drivers.
2283097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    *
2293097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * Note: the type (GLboolean gl_extensions::*) is a "pointer to
2303097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * member" type, the type-safe alternative to the "offsetof" macro.
2313097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * In a nutshell:
2323097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    *
2333097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * - foo bar::* p declares p to be an "offset" to a field of type
2343097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    *   foo that exists within struct bar
2353097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * - &bar::baz computes the "offset" of field baz within struct bar
2363097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * - x.*p accesses the field of x that exists at "offset" p
2373097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * - x->*p is equivalent to (*x).*p
2383097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    */
2393097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   const GLboolean gl_extensions::* supported_flag;
2403097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
2413097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   /**
2423097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * Flag in the _mesa_glsl_parse_state struct that should be set
2433097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * when this extension is enabled.
2443097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    *
2453097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * See note in _mesa_glsl_extension::supported_flag about "pointer
2463097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * to member" types.
2473097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    */
2483097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   bool _mesa_glsl_parse_state::* enable_flag;
2493097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
2503097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   /**
2513097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * Flag in the _mesa_glsl_parse_state struct that should be set
2523097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * when the shader requests "warn" behavior for this extension.
2533097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    *
2543097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * See note in _mesa_glsl_extension::supported_flag about "pointer
2553097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * to member" types.
2563097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    */
2573097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   bool _mesa_glsl_parse_state::* warn_flag;
2583097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
2593097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
2603097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   bool compatible_with_state(const _mesa_glsl_parse_state *state) const;
2613097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   void set_flags(_mesa_glsl_parse_state *state, ext_behavior behavior) const;
2623097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry};
2633097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
2643097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry#define EXT(NAME, VS, GS, FS, GL, ES, SUPPORTED_FLAG)                   \
2653097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   { "GL_" #NAME, VS, GS, FS, GL, ES, &gl_extensions::SUPPORTED_FLAG,   \
2663097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry         &_mesa_glsl_parse_state::NAME##_enable,                        \
2673097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry         &_mesa_glsl_parse_state::NAME##_warn }
2683097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
2693097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry/**
2703097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry * Table of extensions that can be enabled/disabled within a shader,
2713097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry * and the conditions under which they are supported.
2723097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry */
2733097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berrystatic const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
2743097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   /*                                  target availability  API availability */
2753097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   /* name                             VS     GS     FS     GL     ES         supported flag */
276a92ee4abfe5c0bdd9cc921dee5f18436f1df8a4dMarek Olšák   EXT(ARB_conservative_depth,         false, false, true,  true,  false,     ARB_conservative_depth),
2773097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   EXT(ARB_draw_buffers,               false, false, true,  true,  false,     dummy_true),
2783097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   EXT(ARB_draw_instanced,             true,  false, false, true,  false,     ARB_draw_instanced),
2793097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   EXT(ARB_explicit_attrib_location,   true,  false, true,  true,  false,     ARB_explicit_attrib_location),
2803097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   EXT(ARB_fragment_coord_conventions, true,  false, true,  true,  false,     ARB_fragment_coord_conventions),
2813097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   EXT(ARB_texture_rectangle,          true,  false, true,  true,  false,     dummy_true),
2823097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   EXT(EXT_texture_array,              true,  false, true,  true,  false,     EXT_texture_array),
2833097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   EXT(ARB_shader_texture_lod,         true,  false, true,  true,  false,     ARB_shader_texture_lod),
2843097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   EXT(ARB_shader_stencil_export,      false, false, true,  true,  false,     ARB_shader_stencil_export),
285a92ee4abfe5c0bdd9cc921dee5f18436f1df8a4dMarek Olšák   EXT(AMD_conservative_depth,         false, false, true,  true,  false,     ARB_conservative_depth),
2863097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   EXT(AMD_shader_stencil_export,      false, false, true,  true,  false,     ARB_shader_stencil_export),
2873097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   EXT(OES_texture_3D,                 true,  false, true,  false, true,      EXT_texture3D),
2882903816aadb281716b6c59a5a48aeadb84a08f50Chia-I Wu   EXT(OES_EGL_image_external,         true,  false, true,  false, true,      OES_EGL_image_external),
289199771bc325900eb1d3acc7fa03808894a94fdb2Olivier Galibert   EXT(ARB_shader_bit_encoding,        true,  true,  true,  true,  false,     ARB_shader_bit_encoding),
2907fabb2b5939c8640075136fec15d6b87bad9c9ddVincent Lejeune   EXT(ARB_uniform_buffer_object,      true,  false, true,  true,  false,     ARB_uniform_buffer_object),
291d5c918f6adb2f7f72a759607c8f76e7616656c13Tomeu Vizoso   EXT(OES_standard_derivatives,       false, false, true,  false,  true,     OES_standard_derivatives),
2923097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry};
2933097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
2943097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry#undef EXT
2953097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
2963097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
2973097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry/**
2983097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry * Determine whether a given extension is compatible with the target,
2993097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry * API, and extension information in the current parser state.
3003097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry */
3013097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berrybool _mesa_glsl_extension::compatible_with_state(const _mesa_glsl_parse_state *
3023097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry                                                 state) const
3033097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry{
3043097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   /* Check that this extension matches the type of shader we are
3053097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * compiling to.
3063097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    */
3073097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   switch (state->target) {
3083097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   case vertex_shader:
3093097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      if (!this->avail_in_VS) {
3103097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry         return false;
3113097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      }
3123097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      break;
3133097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   case geometry_shader:
3143097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      if (!this->avail_in_GS) {
3153097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry         return false;
3163097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      }
3173097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      break;
3183097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   case fragment_shader:
3193097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      if (!this->avail_in_FS) {
3203097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry         return false;
3213097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      }
3223097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      break;
3233097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   default:
3243097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      assert (!"Unrecognized shader target");
3253097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      return false;
3263097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   }
3273097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
3283097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   /* Check that this extension matches whether we are compiling
3293097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * for desktop GL or GLES.
3303097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    */
3313097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   if (state->es_shader) {
3323097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      if (!this->avail_in_ES) return false;
3333097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   } else {
3343097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      if (!this->avail_in_GL) return false;
3353097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   }
3363097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
3373097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   /* Check that this extension is supported by the OpenGL
3383097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * implementation.
3393097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    *
3403097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * Note: the ->* operator indexes into state->extensions by the
3413097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * offset this->supported_flag.  See
3423097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * _mesa_glsl_extension::supported_flag for more info.
3433097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    */
3443097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   return state->extensions->*(this->supported_flag);
3453097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry}
3463097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
3473097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry/**
3483097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry * Set the appropriate flags in the parser state to establish the
3493097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry * given behavior for this extension.
3503097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry */
3513097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berryvoid _mesa_glsl_extension::set_flags(_mesa_glsl_parse_state *state,
3523097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry                                     ext_behavior behavior) const
3533097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry{
3543097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   /* Note: the ->* operator indexes into state by the
3553097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * offsets this->enable_flag and this->warn_flag.  See
3563097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    * _mesa_glsl_extension::supported_flag for more info.
3573097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry    */
3583097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   state->*(this->enable_flag) = (behavior != extension_disable);
3593097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   state->*(this->warn_flag)   = (behavior == extension_warn);
3603097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry}
3613097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
3623097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry/**
3633097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry * Find an extension by name in _mesa_glsl_supported_extensions.  If
3643097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry * the name is not found, return NULL.
3653097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry */
3663097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berrystatic const _mesa_glsl_extension *find_extension(const char *name)
3673097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry{
3683097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   for (unsigned i = 0; i < Elements(_mesa_glsl_supported_extensions); ++i) {
3693097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      if (strcmp(name, _mesa_glsl_supported_extensions[i].name) == 0) {
3703097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry         return &_mesa_glsl_supported_extensions[i];
3713097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      }
3723097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   }
3733097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   return NULL;
3743097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry}
3753097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
3763097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
377e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanickbool
378e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick_mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp,
3793097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry			     const char *behavior_string, YYLTYPE *behavior_locp,
380e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick			     _mesa_glsl_parse_state *state)
381e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick{
3823097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   ext_behavior behavior;
3833097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   if (strcmp(behavior_string, "warn") == 0) {
3843097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      behavior = extension_warn;
3853097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   } else if (strcmp(behavior_string, "require") == 0) {
3863097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      behavior = extension_require;
3873097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   } else if (strcmp(behavior_string, "enable") == 0) {
3883097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      behavior = extension_enable;
3893097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry   } else if (strcmp(behavior_string, "disable") == 0) {
3903097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      behavior = extension_disable;
391e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick   } else {
392e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick      _mesa_glsl_error(behavior_locp, state,
393e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick		       "Unknown extension behavior `%s'",
3943097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry		       behavior_string);
395e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick      return false;
396e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick   }
397e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick
398e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick   if (strcmp(name, "all") == 0) {
3993097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      if ((behavior == extension_enable) || (behavior == extension_require)) {
400e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick	 _mesa_glsl_error(name_locp, state, "Cannot %s all extensions",
4013097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry			  (behavior == extension_enable)
402e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick			  ? "enable" : "require");
403e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick	 return false;
404c77b257094b15e7c53b62cb50bfbcd7c5003f2a8Ian Romanick      } else {
4053097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry         for (unsigned i = 0;
4063097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry              i < Elements(_mesa_glsl_supported_extensions); ++i) {
4073097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry            const _mesa_glsl_extension *extension
4083097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry               = &_mesa_glsl_supported_extensions[i];
4093097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry            if (extension->compatible_with_state(state)) {
4103097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry               _mesa_glsl_supported_extensions[i].set_flags(state, behavior);
4113097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry            }
4123097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry         }
413c77b257094b15e7c53b62cb50bfbcd7c5003f2a8Ian Romanick      }
414e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick   } else {
4153097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      const _mesa_glsl_extension *extension = find_extension(name);
4163097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry      if (extension && extension->compatible_with_state(state)) {
4173097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry         extension->set_flags(state, behavior);
4181799a0cd41e1a72673b4b469075e7abfcce8ec71Ian Romanick      } else {
4193097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry         static const char *const fmt = "extension `%s' unsupported in %s shader";
4203097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry
4213097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry         if (behavior == extension_require) {
4223097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry            _mesa_glsl_error(name_locp, state, fmt,
4233097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry                             name, _mesa_glsl_shader_target_name(state->target));
4243097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry            return false;
4253097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry         } else {
4263097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry            _mesa_glsl_warning(name_locp, state, fmt,
4273097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry                               name, _mesa_glsl_shader_target_name(state->target));
4283097715d41da4b725b7ce9f9d5bbc0f684cbf0a6Paul Berry         }
429e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick      }
430e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick   }
431e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick
432e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick   return true;
433e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick}
434e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick
435a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick_mesa_ast_type_qualifier_print(const struct ast_type_qualifier *q)
437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
438e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (q->flags.q.constant)
439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("const ");
440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
441e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (q->flags.q.invariant)
442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("invariant ");
443a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
444e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (q->flags.q.attribute)
445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("attribute ");
446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
447e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (q->flags.q.varying)
448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("varying ");
449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
450e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (q->flags.q.in && q->flags.q.out)
451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("inout ");
452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   else {
453e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick      if (q->flags.q.in)
454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 printf("in ");
455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
456e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick      if (q->flags.q.out)
457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 printf("out ");
458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
459a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
460e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (q->flags.q.centroid)
461a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("centroid ");
462e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (q->flags.q.uniform)
463a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("uniform ");
464e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (q->flags.q.smooth)
465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("smooth ");
466e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (q->flags.q.flat)
467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("flat ");
468e24d35a5b59ca1e75b69a32db6294787378a963fIan Romanick   if (q->flags.q.noperspective)
469a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("noperspective ");
470a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
471a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
472a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
473a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
474a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_node::print(void) const
475a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
47603d3f3ab71ba280071f54cb60505212be6710f8eIan Romanick   printf("unhandled node ");
477a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
478a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_node::ast_node(void)
481a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
482ec9675ec533cc0c0c7b1c738280e9b9adf2591fbCarl Worth   this->location.source = 0;
483ec9675ec533cc0c0c7b1c738280e9b9adf2591fbCarl Worth   this->location.line = 0;
484ec9675ec533cc0c0c7b1c738280e9b9adf2591fbCarl Worth   this->location.column = 0;
485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic void
489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_opt_array_size_print(bool is_array, const ast_expression *array_size)
490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (is_array) {
492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("[ ");
493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (array_size)
495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 array_size->print();
496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
497a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("] ");
498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
502a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_compound_statement::print(void) const
504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   printf("{\n");
506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
507304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick   foreach_list_const(n, &this->statements) {
508304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      ast_node *ast = exec_node_data(ast_node, n, link);
509304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      ast->print();
510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   printf("}\n");
513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_compound_statement::ast_compound_statement(int new_scope,
517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick					       ast_node *statements)
518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->new_scope = new_scope;
520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (statements != NULL) {
522304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      this->statements.push_degenerate_list_at_head(&statements->link);
523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_expression::print(void) const
529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   switch (oper) {
531a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_assign:
532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_mul_assign:
533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_div_assign:
534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_mod_assign:
535a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_add_assign:
536a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_sub_assign:
537a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_ls_assign:
538a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_rs_assign:
539a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_and_assign:
540a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_xor_assign:
541a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_or_assign:
542a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      subexpressions[0]->print();
54388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      printf("%s ", operator_string(oper));
544a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      subexpressions[1]->print();
545a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
546a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_field_selection:
548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      subexpressions[0]->print();
549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf(". %s ", primary_expression.identifier);
550a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_plus:
553a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_neg:
554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bit_not:
555a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_logic_not:
556a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_pre_inc:
557a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_pre_dec:
55888349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      printf("%s ", operator_string(oper));
559a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      subexpressions[0]->print();
560a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
561a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
562a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_post_inc:
563a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_post_dec:
564a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      subexpressions[0]->print();
56588349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      printf("%s ", operator_string(oper));
566a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
567a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
568a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_conditional:
569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      subexpressions[0]->print();
570a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("? ");
571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      subexpressions[1]->print();
572a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf(": ");
57326b566e19cbfa189a6a158718f21859c0b7ed090Paul Berry      subexpressions[2]->print();
574a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
575a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
576a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_array_index:
577a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      subexpressions[0]->print();
578a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("[ ");
579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      subexpressions[1]->print();
580a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("] ");
581a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
582a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
583a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_function_call: {
584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      subexpressions[0]->print();
585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("( ");
586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
587304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      foreach_list_const (n, &this->expressions) {
5882384937835c1cfbce8c6361ad0972761e17ae1a7Ian Romanick	 if (n != this->expressions.get_head())
5892384937835c1cfbce8c6361ad0972761e17ae1a7Ian Romanick	    printf(", ");
590304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick
591304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick	 ast_node *ast = exec_node_data(ast_node, n, link);
592304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick	 ast->print();
593a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
594a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
595a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf(") ");
596a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
597a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
598a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
599a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_identifier:
600a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("%s ", primary_expression.identifier);
601a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
602a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_int_constant:
604a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("%d ", primary_expression.int_constant);
605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_uint_constant:
608a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("%u ", primary_expression.uint_constant);
609a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
610a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
611a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_float_constant:
612a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("%f ", primary_expression.float_constant);
613a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
614a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
615a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_bool_constant:
616a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("%s ",
617a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	     primary_expression.bool_constant
618a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	     ? "true" : "false");
619a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
620a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
621a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_sequence: {
622a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("( ");
623304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      foreach_list_const(n, & this->expressions) {
624304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick	 if (n != this->expressions.get_head())
625a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	    printf(", ");
626a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
627304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick	 ast_node *ast = exec_node_data(ast_node, n, link);
628304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick	 ast->print();
629a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      }
630a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf(") ");
631a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
632a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
63388349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick
63488349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick   default:
63588349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      assert(0);
63688349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick      break;
637a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
638a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
639a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
640a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_expression::ast_expression(int oper,
641a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			       ast_expression *ex0,
642a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			       ast_expression *ex1,
643a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick			       ast_expression *ex2)
644a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
645a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->oper = ast_operators(oper);
646a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->subexpressions[0] = ex0;
647a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->subexpressions[1] = ex1;
648a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->subexpressions[2] = ex2;
649fa0a9ac5cdf49865cfc289c4326c73c9dd4a61c5Ian Romanick   this->non_lvalue_description = NULL;
650a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
651a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
652a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
653a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
654a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_expression_statement::print(void) const
655a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
656a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (expression)
657a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      expression->print();
658a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
659a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   printf("; ");
660a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
661a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
662a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
663a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_expression_statement::ast_expression_statement(ast_expression *ex) :
664a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   expression(ex)
665a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
666a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   /* empty */
667a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
668a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
669a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
670a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
671a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_function::print(void) const
672a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
673a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   return_type->print();
674a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   printf(" %s (", identifier);
675a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
676304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick   foreach_list_const(n, & this->parameters) {
677304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      ast_node *ast = exec_node_data(ast_node, n, link);
678304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      ast->print();
679a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
680a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
681a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   printf(")");
682a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
683a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
684a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
685a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_function::ast_function(void)
68692318a947958892497722772b03c643ebc943294Ian Romanick   : is_definition(false), signature(NULL)
687a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
688304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick   /* empty */
689a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
690a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
691a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
692a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
693a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_fully_specified_type::print(void) const
694a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
695a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   _mesa_ast_type_qualifier_print(& qualifier);
696a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   specifier->print();
697a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
698a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
699a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
700a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
701a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_parameter_declarator::print(void) const
702a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
703a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   type->print();
704a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (identifier)
705a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("%s ", identifier);
706a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_opt_array_size_print(is_array, array_size);
707a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
708a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
709a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
710a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
711a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_function_definition::print(void) const
712a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
713a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   prototype->print();
714a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   body->print();
715a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
716a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
717a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
718a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
719a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_declaration::print(void) const
720a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
721a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   printf("%s ", identifier);
722a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   ast_opt_array_size_print(is_array, array_size);
723a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
724a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (initializer) {
725a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("= ");
726a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      initializer->print();
727a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
728a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
729a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
730a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
731b2c0df2b60a77b043d461f265c85d8b5b066a008Kenneth Graunkeast_declaration::ast_declaration(const char *identifier, int is_array,
732a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				 ast_expression *array_size,
733a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick				 ast_expression *initializer)
734a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
735a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->identifier = identifier;
736a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->is_array = is_array;
737a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->array_size = array_size;
738a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->initializer = initializer;
739a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
740a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
741a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
742a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
743a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_declarator_list::print(void) const
744a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
745a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   assert(type || invariant);
746a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
747a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (type)
748a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      type->print();
749a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   else
750a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("invariant ");
751a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
752304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick   foreach_list_const (ptr, & this->declarations) {
753304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      if (ptr != this->declarations.get_head())
754a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 printf(", ");
755a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
756304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      ast_node *ast = exec_node_data(ast_node, ptr, link);
757304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      ast->print();
758a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
759a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
760a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   printf("; ");
761a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
762a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
763a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
764a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_declarator_list::ast_declarator_list(ast_fully_specified_type *type)
765a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
766a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->type = type;
7673832706f81d7f5310882eda6d7ef0c3e39593b18Ian Romanick   this->invariant = false;
768f7561e8ecd80e915150ca63c0c79a5f9839c8e12Eric Anholt   this->ubo_qualifiers_valid = false;
769a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
770a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
771a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
772a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_jump_statement::print(void) const
773a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
774a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   switch (mode) {
775a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_continue:
776a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("continue; ");
777a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
778a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_break:
779a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("break; ");
780a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
781a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_return:
782a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("return ");
783a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (opt_return_value)
784a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 opt_return_value->print();
785a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
786a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("; ");
787a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
788a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_discard:
789a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("discard; ");
790a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
791a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
792a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
793a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
794a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
795a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_jump_statement::ast_jump_statement(int mode, ast_expression *return_value)
796a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
797a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->mode = ast_jump_modes(mode);
798a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
799a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (mode == ast_return)
800a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      opt_return_value = return_value;
801a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
802a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
803a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
804a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
805a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_selection_statement::print(void) const
806a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
807a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   printf("if ( ");
808a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   condition->print();
809a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   printf(") ");
810a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
811a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   then_statement->print();
812a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
813a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   if (else_statement) {
814a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("else ");
815a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      else_statement->print();
816a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
817a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
818a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
819a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
820a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
821a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_selection_statement::ast_selection_statement(ast_expression *condition,
822a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick						 ast_node *then_statement,
823a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick						 ast_node *else_statement)
824a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
825a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->condition = condition;
826a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->then_statement = then_statement;
827a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->else_statement = else_statement;
828a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
829a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
830a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
831a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
83285beb39e14556cf02f58116fd287120cd1defbd5Dan McCabeast_switch_statement::print(void) const
83385beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe{
83485beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   printf("switch ( ");
83585beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   test_expression->print();
83685beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   printf(") ");
83785beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
83885beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   body->print();
83985beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe}
84085beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
84185beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
84285beb39e14556cf02f58116fd287120cd1defbd5Dan McCabeast_switch_statement::ast_switch_statement(ast_expression *test_expression,
84385beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe					   ast_node *body)
84485beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe{
84585beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   this->test_expression = test_expression;
84685beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   this->body = body;
84785beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe}
84885beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
84985beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
85085beb39e14556cf02f58116fd287120cd1defbd5Dan McCabevoid
85185beb39e14556cf02f58116fd287120cd1defbd5Dan McCabeast_switch_body::print(void) const
85285beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe{
85385beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   printf("{\n");
85485beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   if (stmts != NULL) {
85585beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe      stmts->print();
85685beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   }
85785beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   printf("}\n");
85885beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe}
85985beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
86085beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
86185beb39e14556cf02f58116fd287120cd1defbd5Dan McCabeast_switch_body::ast_switch_body(ast_case_statement_list *stmts)
86285beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe{
86385beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   this->stmts = stmts;
86485beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe}
86585beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
86685beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
86785beb39e14556cf02f58116fd287120cd1defbd5Dan McCabevoid ast_case_label::print(void) const
86885beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe{
86985beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   if (test_value != NULL) {
87085beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe      printf("case ");
87185beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe      test_value->print();
87285beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe      printf(": ");
87385beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   } else {
87485beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe      printf("default: ");
87585beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   }
87685beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe}
87785beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
87885beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
87985beb39e14556cf02f58116fd287120cd1defbd5Dan McCabeast_case_label::ast_case_label(ast_expression *test_value)
88085beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe{
88185beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   this->test_value = test_value;
88285beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe}
88385beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
88485beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
88585beb39e14556cf02f58116fd287120cd1defbd5Dan McCabevoid ast_case_label_list::print(void) const
88685beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe{
88785beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   foreach_list_const(n, & this->labels) {
88885beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe      ast_node *ast = exec_node_data(ast_node, n, link);
88985beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe      ast->print();
89085beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   }
89185beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   printf("\n");
89285beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe}
89385beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
89485beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
89585beb39e14556cf02f58116fd287120cd1defbd5Dan McCabeast_case_label_list::ast_case_label_list(void)
89685beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe{
89785beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe}
89885beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
89985beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
90085beb39e14556cf02f58116fd287120cd1defbd5Dan McCabevoid ast_case_statement::print(void) const
90185beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe{
90285beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   labels->print();
90385beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   foreach_list_const(n, & this->stmts) {
90485beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe      ast_node *ast = exec_node_data(ast_node, n, link);
90585beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe      ast->print();
90685beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe      printf("\n");
90785beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   }
90885beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe}
90985beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
91085beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
91185beb39e14556cf02f58116fd287120cd1defbd5Dan McCabeast_case_statement::ast_case_statement(ast_case_label_list *labels)
91285beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe{
91385beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   this->labels = labels;
91485beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe}
91585beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
91685beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
91785beb39e14556cf02f58116fd287120cd1defbd5Dan McCabevoid ast_case_statement_list::print(void) const
91885beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe{
91985beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   foreach_list_const(n, & this->cases) {
92085beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe      ast_node *ast = exec_node_data(ast_node, n, link);
92185beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe      ast->print();
92285beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe   }
92385beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe}
92485beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
92585beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
92685beb39e14556cf02f58116fd287120cd1defbd5Dan McCabeast_case_statement_list::ast_case_statement_list(void)
92785beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe{
92885beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe}
92985beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
93085beb39e14556cf02f58116fd287120cd1defbd5Dan McCabe
93185beb39e14556cf02f58116fd287120cd1defbd5Dan McCabevoid
932a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_iteration_statement::print(void) const
933a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
934a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   switch (mode) {
935a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_for:
936a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("for( ");
937a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (init_statement)
938a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 init_statement->print();
939a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("; ");
940a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
941a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (condition)
942a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 condition->print();
943a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("; ");
944a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
945a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (rest_expression)
946a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 rest_expression->print();
947a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf(") ");
948a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
949a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      body->print();
950a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
951a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
952a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_while:
953a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("while ( ");
954a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (condition)
955a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 condition->print();
956a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf(") ");
957a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      body->print();
958a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
959a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
960a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   case ast_do_while:
961a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("do ");
962a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      body->print();
963a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("while ( ");
964a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      if (condition)
965a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick	 condition->print();
966a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      printf("); ");
967a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick      break;
968a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
969a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
970a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
971a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
972a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_iteration_statement::ast_iteration_statement(int mode,
973a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick						 ast_node *init,
974a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick						 ast_node *condition,
975a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick						 ast_expression *rest_expression,
976a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick						 ast_node *body)
977a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
978a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->mode = ast_iteration_modes(mode);
979a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->init_statement = init;
980a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->condition = condition;
981a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->rest_expression = rest_expression;
982a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   this->body = body;
983a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
984a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
985a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
986a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid
987a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_struct_specifier::print(void) const
988a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
989a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   printf("struct %s { ", name);
990304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick   foreach_list_const(n, &this->declarations) {
991304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      ast_node *ast = exec_node_data(ast_node, n, link);
992304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick      ast->print();
993a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   }
994a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   printf("} ");
995a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
996a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
997a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick
998b2c0df2b60a77b043d461f265c85d8b5b066a008Kenneth Graunkeast_struct_specifier::ast_struct_specifier(const char *identifier,
999912a429bc529a017a426f06631b31da1c0eaa3aeEric Anholt					   ast_declarator_list *declarator_list)
1000a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{
1001ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke   if (identifier == NULL) {
1002ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke      static unsigned anon_count = 1;
1003d3073f58c17d8675a2ecdd5dfa83e5520c78e1a8Kenneth Graunke      identifier = ralloc_asprintf(this, "#anon_struct_%04x", anon_count);
1004ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke      anon_count++;
1005ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke   }
1006a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick   name = identifier;
1007304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick   this->declarations.push_degenerate_list_at_head(&declarator_list->link);
1008a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick}
10092f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt
10101d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick/**
10111d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick * Do the set of common optimizations passes
10121d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick *
10131d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick * \param ir                          List of instructions to be optimized
10141d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick * \param linked                      Is the shader linked?  This enables
10151d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick *                                    optimizations passes that remove code at
10161d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick *                                    global scope and could cause linking to
10171d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick *                                    fail.
10181d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick * \param uniform_locations_assigned  Have locations already been assigned for
10191d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick *                                    uniforms?  This prevents the declarations
10201d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick *                                    of unused uniforms from being removed.
10211d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick *                                    The setting of this flag only matters if
10221d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick *                                    \c linked is \c true.
10231d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick * \param max_unroll_iterations       Maximum number of loop iterations to be
10241d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick *                                    unrolled.  Setting to 0 forces all loops
10251d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick *                                    to be unrolled.
10261d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick */
10272f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholtbool
10281d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanickdo_common_optimization(exec_list *ir, bool linked,
10291d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick		       bool uniform_locations_assigned,
10301d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick		       unsigned max_unroll_iterations)
10312f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt{
10322f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   GLboolean progress = GL_FALSE;
10332f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt
103463684a9ae7a66f68df1f2c68cd9358e5622122a3Kenneth Graunke   progress = lower_instructions(ir, SUB_TO_ADD_NEG) || progress;
10352f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt
10362f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   if (linked) {
10372f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt      progress = do_function_inlining(ir) || progress;
10382f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt      progress = do_dead_functions(ir) || progress;
103960df737ad57c20701b66d7cd3f63d1dc75745986Eric Anholt      progress = do_structure_splitting(ir) || progress;
10402f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   }
10412f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   progress = do_if_simplification(ir) || progress;
10422f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   progress = do_copy_propagation(ir) || progress;
10436a35cbb656e0f8a2479a63eadefb1ab85f42d490Eric Anholt   progress = do_copy_propagation_elements(ir) || progress;
10442f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   if (linked)
10451d5d67f8adac9f94715de9804adb536d9a7ec5eeIan Romanick      progress = do_dead_code(ir, uniform_locations_assigned) || progress;
10462f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   else
10472f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt      progress = do_dead_code_unlinked(ir) || progress;
10482f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   progress = do_dead_code_local(ir) || progress;
10492f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   progress = do_tree_grafting(ir) || progress;
10502f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   progress = do_constant_propagation(ir) || progress;
10512f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   if (linked)
10522f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt      progress = do_constant_variable(ir) || progress;
10532f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   else
10542f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt      progress = do_constant_variable_unlinked(ir) || progress;
10552f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   progress = do_constant_folding(ir) || progress;
10562f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   progress = do_algebraic(ir) || progress;
10573361cbac2a883818efeb2b3e27405eeefce60f63Luca Barbieri   progress = do_lower_jumps(ir) || progress;
10582f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   progress = do_vec_index_to_swizzle(ir) || progress;
10592f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   progress = do_swizzle_swizzle(ir) || progress;
10608f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt   progress = do_noop_swizzle(ir) || progress;
10612f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt
106260177d5e2aec07ed6386a6935b118a356d58c4ecEric Anholt   progress = optimize_split_arrays(ir, linked) || progress;
10638f2214f4892acb994d13531d555196bd8f242dadIan Romanick   progress = optimize_redundant_jumps(ir) || progress;
10648f2214f4892acb994d13531d555196bd8f242dadIan Romanick
10658df2dbf91ddfd0c1590e33015e85470b67e69319Ian Romanick   loop_state *ls = analyze_loop_variables(ir);
106658c988ada56114b56477983f66b4039219f1a82cEric Anholt   if (ls->loop_found) {
106758c988ada56114b56477983f66b4039219f1a82cEric Anholt      progress = set_loop_controls(ir, ls) || progress;
106858c988ada56114b56477983f66b4039219f1a82cEric Anholt      progress = unroll_loops(ir, ls, max_unroll_iterations) || progress;
106958c988ada56114b56477983f66b4039219f1a82cEric Anholt   }
10708df2dbf91ddfd0c1590e33015e85470b67e69319Ian Romanick   delete ls;
10718df2dbf91ddfd0c1590e33015e85470b67e69319Ian Romanick
10722f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt   return progress;
10732f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt}
1074b83846475bac76268d75f53632faf8aad8cad02cEric Anholt
1075b83846475bac76268d75f53632faf8aad8cad02cEric Anholtextern "C" {
1076b83846475bac76268d75f53632faf8aad8cad02cEric Anholt
1077b83846475bac76268d75f53632faf8aad8cad02cEric Anholt/**
1078b83846475bac76268d75f53632faf8aad8cad02cEric Anholt * To be called at GL teardown time, this frees compiler datastructures.
1079b83846475bac76268d75f53632faf8aad8cad02cEric Anholt *
1080b83846475bac76268d75f53632faf8aad8cad02cEric Anholt * After calling this, any previously compiled shaders and shader
1081b83846475bac76268d75f53632faf8aad8cad02cEric Anholt * programs would be invalid.  So this should happen at approximately
1082b83846475bac76268d75f53632faf8aad8cad02cEric Anholt * program exit.
1083b83846475bac76268d75f53632faf8aad8cad02cEric Anholt */
1084b83846475bac76268d75f53632faf8aad8cad02cEric Anholtvoid
1085b83846475bac76268d75f53632faf8aad8cad02cEric Anholt_mesa_destroy_shader_compiler(void)
1086b83846475bac76268d75f53632faf8aad8cad02cEric Anholt{
1087b83846475bac76268d75f53632faf8aad8cad02cEric Anholt   _mesa_destroy_shader_compiler_caches();
1088b83846475bac76268d75f53632faf8aad8cad02cEric Anholt
1089b83846475bac76268d75f53632faf8aad8cad02cEric Anholt   _mesa_glsl_release_types();
1090b83846475bac76268d75f53632faf8aad8cad02cEric Anholt}
1091b83846475bac76268d75f53632faf8aad8cad02cEric Anholt
1092b83846475bac76268d75f53632faf8aad8cad02cEric Anholt/**
1093b83846475bac76268d75f53632faf8aad8cad02cEric Anholt * Releases compiler caches to trade off performance for memory.
1094b83846475bac76268d75f53632faf8aad8cad02cEric Anholt *
1095b83846475bac76268d75f53632faf8aad8cad02cEric Anholt * Intended to be used with glReleaseShaderCompiler().
1096b83846475bac76268d75f53632faf8aad8cad02cEric Anholt */
1097b83846475bac76268d75f53632faf8aad8cad02cEric Anholtvoid
1098b83846475bac76268d75f53632faf8aad8cad02cEric Anholt_mesa_destroy_shader_compiler_caches(void)
1099b83846475bac76268d75f53632faf8aad8cad02cEric Anholt{
1100b83846475bac76268d75f53632faf8aad8cad02cEric Anholt   _mesa_glsl_release_functions();
1101b83846475bac76268d75f53632faf8aad8cad02cEric Anholt}
1102b83846475bac76268d75f53632faf8aad8cad02cEric Anholt
1103b83846475bac76268d75f53632faf8aad8cad02cEric Anholt}
1104