glsl_parser_extras.cpp revision ca92ae2699c4aad21c0811b9a5562b9223816caf
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" { 29b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke#include <talloc.h> 30bfd7c9ac228c7ed8aec04c3b3aa33f40ee00b035Chia-I Wu#include "main/core.h" /* for struct __GLcontextRec */ 31b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke} 32b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke 33a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "ast.h" 34a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick#include "glsl_parser_extras.h" 35d59673c9de9f14e6aefcdb0b06751d935385c4aaIan Romanick#include "glsl_parser.h" 362f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt#include "ir_optimization.h" 378df2dbf91ddfd0c1590e33015e85470b67e69319Ian Romanick#include "loop_analysis.h" 38a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 392462a536ea5c98867296905e3da127eba7c7bdffIan Romanick_mesa_glsl_parse_state::_mesa_glsl_parse_state(struct __GLcontextRec *ctx, 402462a536ea5c98867296905e3da127eba7c7bdffIan Romanick GLenum target, void *mem_ctx) 412462a536ea5c98867296905e3da127eba7c7bdffIan Romanick{ 422462a536ea5c98867296905e3da127eba7c7bdffIan Romanick switch (target) { 432462a536ea5c98867296905e3da127eba7c7bdffIan Romanick case GL_VERTEX_SHADER: this->target = vertex_shader; break; 442462a536ea5c98867296905e3da127eba7c7bdffIan Romanick case GL_FRAGMENT_SHADER: this->target = fragment_shader; break; 452462a536ea5c98867296905e3da127eba7c7bdffIan Romanick case GL_GEOMETRY_SHADER: this->target = geometry_shader; break; 462462a536ea5c98867296905e3da127eba7c7bdffIan Romanick } 472462a536ea5c98867296905e3da127eba7c7bdffIan Romanick 482462a536ea5c98867296905e3da127eba7c7bdffIan Romanick this->scanner = NULL; 492462a536ea5c98867296905e3da127eba7c7bdffIan Romanick this->translation_unit.make_empty(); 502462a536ea5c98867296905e3da127eba7c7bdffIan Romanick this->symbols = new(mem_ctx) glsl_symbol_table; 512462a536ea5c98867296905e3da127eba7c7bdffIan Romanick this->info_log = talloc_strdup(mem_ctx, ""); 522462a536ea5c98867296905e3da127eba7c7bdffIan Romanick this->error = false; 532462a536ea5c98867296905e3da127eba7c7bdffIan Romanick this->loop_or_switch_nesting = NULL; 54814c89abdbcd5b841b98746af921796df0362238Kenneth Graunke 55814c89abdbcd5b841b98746af921796df0362238Kenneth Graunke /* Set default language version and extensions */ 56814c89abdbcd5b841b98746af921796df0362238Kenneth Graunke this->language_version = 110; 57719caa403ecc3345b86708f8172600d80132d6cbKenneth Graunke this->es_shader = false; 582462a536ea5c98867296905e3da127eba7c7bdffIan Romanick this->ARB_texture_rectangle_enable = true; 592462a536ea5c98867296905e3da127eba7c7bdffIan Romanick 60dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu /* OpenGL ES 2.0 has different defaults from desktop GL. */ 61dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu if (ctx->API == API_OPENGLES2) { 62dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->language_version = 100; 63dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->es_shader = true; 64dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->ARB_texture_rectangle_enable = false; 652462a536ea5c98867296905e3da127eba7c7bdffIan Romanick } 66dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu 67dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->extensions = &ctx->Extensions; 68dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu 69dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->Const.MaxLights = ctx->Const.MaxLights; 70dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->Const.MaxClipPlanes = ctx->Const.MaxClipPlanes; 71dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->Const.MaxTextureUnits = ctx->Const.MaxTextureUnits; 72dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->Const.MaxTextureCoords = ctx->Const.MaxTextureCoordUnits; 73dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->Const.MaxVertexAttribs = ctx->Const.VertexProgram.MaxAttribs; 74dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->Const.MaxVertexUniformComponents = ctx->Const.VertexProgram.MaxUniformComponents; 75dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->Const.MaxVaryingFloats = ctx->Const.MaxVarying * 4; 76dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->Const.MaxVertexTextureImageUnits = ctx->Const.MaxVertexTextureImageUnits; 77dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->Const.MaxCombinedTextureImageUnits = ctx->Const.MaxCombinedTextureImageUnits; 78dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->Const.MaxTextureImageUnits = ctx->Const.MaxTextureImageUnits; 79dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->Const.MaxFragmentUniformComponents = ctx->Const.FragmentProgram.MaxUniformComponents; 80dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu 81dc754586ca84741b4df5b72fd235c4134816854cChia-I Wu this->Const.MaxDrawBuffers = ctx->Const.MaxDrawBuffers; 822462a536ea5c98867296905e3da127eba7c7bdffIan Romanick} 832462a536ea5c98867296905e3da127eba7c7bdffIan Romanick 845bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanickconst char * 855bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick_mesa_glsl_shader_target_name(enum _mesa_glsl_parser_targets target) 865bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick{ 875bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick switch (target) { 885bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick case vertex_shader: return "vertex"; 895bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick case fragment_shader: return "fragment"; 905bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick case geometry_shader: return "geometry"; 9181f49a774eec3990b0a6ffeca75119e6a3ef827dEric Anholt case ir_shader: break; 925bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick } 935bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick 945bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick assert(!"Should not get here."); 9587a2ee8db6222006480bd0e0ac58b77795c5d951Eric Anholt return "unknown"; 965bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick} 975bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick 985bfe30a02be67f2b0e757921295a89adfd368e3fIan Romanick 99a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 1001f585180597290c7891c43dc0da3c9c06d7cebb1Ian Romanick_mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state, 1011f585180597290c7891c43dc0da3c9c06d7cebb1Ian Romanick const char *fmt, ...) 102a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 103a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick va_list ap; 104a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 10571d0bbfcb2853f37b580ec7b705e55bb0eb426faIan Romanick state->error = true; 1061f585180597290c7891c43dc0da3c9c06d7cebb1Ian Romanick 107b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke assert(state->info_log != NULL); 108b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke state->info_log = talloc_asprintf_append(state->info_log, 109b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke "%u:%u(%u): error: ", 110b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke locp->source, 111b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke locp->first_line, 112b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke locp->first_column); 113a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick va_start(ap, fmt); 114b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke state->info_log = talloc_vasprintf_append(state->info_log, fmt, ap); 115a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick va_end(ap); 116b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke state->info_log = talloc_strdup_append(state->info_log, "\n"); 117a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 118a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 119a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 12056b8b214107a0320c7277cd832480998057f8413Ian Romanickvoid 1213623df68fa9f4db88c436425524bc27c7f59a051Eric Anholt_mesa_glsl_warning(const YYLTYPE *locp, _mesa_glsl_parse_state *state, 12256b8b214107a0320c7277cd832480998057f8413Ian Romanick const char *fmt, ...) 12356b8b214107a0320c7277cd832480998057f8413Ian Romanick{ 12456b8b214107a0320c7277cd832480998057f8413Ian Romanick va_list ap; 12556b8b214107a0320c7277cd832480998057f8413Ian Romanick 126b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke assert(state->info_log != NULL); 127b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke state->info_log = talloc_asprintf_append(state->info_log, 128b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke "%u:%u(%u): warning: ", 129b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke locp->source, 130b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke locp->first_line, 131b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke locp->first_column); 13256b8b214107a0320c7277cd832480998057f8413Ian Romanick va_start(ap, fmt); 133b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke state->info_log = talloc_vasprintf_append(state->info_log, fmt, ap); 13456b8b214107a0320c7277cd832480998057f8413Ian Romanick va_end(ap); 135b2ba6fac09df1f06161a7ea1ef1f25bb9fbe8a5aKenneth Graunke state->info_log = talloc_strdup_append(state->info_log, "\n"); 13656b8b214107a0320c7277cd832480998057f8413Ian Romanick} 13756b8b214107a0320c7277cd832480998057f8413Ian Romanick 13856b8b214107a0320c7277cd832480998057f8413Ian Romanick 139e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanickbool 140e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick_mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp, 141e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick const char *behavior, YYLTYPE *behavior_locp, 142e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick _mesa_glsl_parse_state *state) 143e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick{ 144e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick enum { 145e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick extension_disable, 146e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick extension_enable, 147e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick extension_require, 148e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick extension_warn 149e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick } ext_mode; 150e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick 151e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick if (strcmp(behavior, "warn") == 0) { 152e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick ext_mode = extension_warn; 153e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick } else if (strcmp(behavior, "require") == 0) { 154e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick ext_mode = extension_require; 155e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick } else if (strcmp(behavior, "enable") == 0) { 156e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick ext_mode = extension_enable; 157e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick } else if (strcmp(behavior, "disable") == 0) { 158e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick ext_mode = extension_disable; 159e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick } else { 160e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick _mesa_glsl_error(behavior_locp, state, 161e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick "Unknown extension behavior `%s'", 162e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick behavior); 163e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick return false; 164e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick } 165e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick 166887a8b07deffa578b7d6540257a0c5f8c4d5d97cIan Romanick bool unsupported = false; 167887a8b07deffa578b7d6540257a0c5f8c4d5d97cIan Romanick 168e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick if (strcmp(name, "all") == 0) { 169e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick if ((ext_mode == extension_enable) || (ext_mode == extension_require)) { 170e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick _mesa_glsl_error(name_locp, state, "Cannot %s all extensions", 171e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick (ext_mode == extension_enable) 172e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick ? "enable" : "require"); 173e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick return false; 174e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick } 175eb56cea3b3011f46453d4bb7d06de2e9f6b12232Ian Romanick } else if (strcmp(name, "GL_ARB_draw_buffers") == 0) { 176c77b257094b15e7c53b62cb50bfbcd7c5003f2a8Ian Romanick /* This extension is only supported in fragment shaders. 177c77b257094b15e7c53b62cb50bfbcd7c5003f2a8Ian Romanick */ 178c77b257094b15e7c53b62cb50bfbcd7c5003f2a8Ian Romanick if (state->target != fragment_shader) { 179c77b257094b15e7c53b62cb50bfbcd7c5003f2a8Ian Romanick unsupported = true; 180c77b257094b15e7c53b62cb50bfbcd7c5003f2a8Ian Romanick } else { 181c77b257094b15e7c53b62cb50bfbcd7c5003f2a8Ian Romanick state->ARB_draw_buffers_enable = (ext_mode != extension_disable); 182c77b257094b15e7c53b62cb50bfbcd7c5003f2a8Ian Romanick state->ARB_draw_buffers_warn = (ext_mode == extension_warn); 183c77b257094b15e7c53b62cb50bfbcd7c5003f2a8Ian Romanick } 184f50f06552eb1e4af27d6fe99c381eac6a0a4ea0fIan Romanick } else if (strcmp(name, "GL_ARB_fragment_coord_conventions") == 0) { 185f50f06552eb1e4af27d6fe99c381eac6a0a4ea0fIan Romanick state->ARB_fragment_coord_conventions_enable = 186f50f06552eb1e4af27d6fe99c381eac6a0a4ea0fIan Romanick (ext_mode != extension_disable); 187f50f06552eb1e4af27d6fe99c381eac6a0a4ea0fIan Romanick state->ARB_fragment_coord_conventions_warn = 188f50f06552eb1e4af27d6fe99c381eac6a0a4ea0fIan Romanick (ext_mode == extension_warn); 189f50f06552eb1e4af27d6fe99c381eac6a0a4ea0fIan Romanick 190f50f06552eb1e4af27d6fe99c381eac6a0a4ea0fIan Romanick unsupported = !state->extensions->ARB_fragment_coord_conventions; 191eb56cea3b3011f46453d4bb7d06de2e9f6b12232Ian Romanick } else if (strcmp(name, "GL_ARB_texture_rectangle") == 0) { 1920c824653952a67722c242616bb34a4796b42f660Ian Romanick state->ARB_texture_rectangle_enable = (ext_mode != extension_disable); 1930c824653952a67722c242616bb34a4796b42f660Ian Romanick state->ARB_texture_rectangle_warn = (ext_mode == extension_warn); 194667f4e1940c4c4660e35dc9906672a476369660fIan Romanick } else if (strcmp(name, "GL_EXT_texture_array") == 0) { 195667f4e1940c4c4660e35dc9906672a476369660fIan Romanick state->EXT_texture_array_enable = (ext_mode != extension_disable); 196667f4e1940c4c4660e35dc9906672a476369660fIan Romanick state->EXT_texture_array_warn = (ext_mode == extension_warn); 197667f4e1940c4c4660e35dc9906672a476369660fIan Romanick 198667f4e1940c4c4660e35dc9906672a476369660fIan Romanick unsupported = !state->extensions->EXT_texture_array; 199e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick } else { 200887a8b07deffa578b7d6540257a0c5f8c4d5d97cIan Romanick unsupported = true; 201887a8b07deffa578b7d6540257a0c5f8c4d5d97cIan Romanick } 202887a8b07deffa578b7d6540257a0c5f8c4d5d97cIan Romanick 203887a8b07deffa578b7d6540257a0c5f8c4d5d97cIan Romanick if (unsupported) { 204887a8b07deffa578b7d6540257a0c5f8c4d5d97cIan Romanick static const char *const fmt = "extension `%s' unsupported in %s shader"; 205887a8b07deffa578b7d6540257a0c5f8c4d5d97cIan Romanick 206e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick if (ext_mode == extension_require) { 207887a8b07deffa578b7d6540257a0c5f8c4d5d97cIan Romanick _mesa_glsl_error(name_locp, state, fmt, 208887a8b07deffa578b7d6540257a0c5f8c4d5d97cIan Romanick name, _mesa_glsl_shader_target_name(state->target)); 209e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick return false; 2101799a0cd41e1a72673b4b469075e7abfcce8ec71Ian Romanick } else { 211887a8b07deffa578b7d6540257a0c5f8c4d5d97cIan Romanick _mesa_glsl_warning(name_locp, state, fmt, 212887a8b07deffa578b7d6540257a0c5f8c4d5d97cIan Romanick name, _mesa_glsl_shader_target_name(state->target)); 213e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick } 214e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick } 215e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick 216e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick return true; 217e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick} 218e701761cc84a136c2e1b3cf341bc0edb90492278Ian Romanick 219a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 220a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick_mesa_ast_type_qualifier_print(const struct ast_type_qualifier *q) 221a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 222a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (q->constant) 223a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("const "); 224a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 225a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (q->invariant) 226a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("invariant "); 227a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 228a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (q->attribute) 229a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("attribute "); 230a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 231a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (q->varying) 232a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("varying "); 233a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 234a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (q->in && q->out) 235a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("inout "); 236a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick else { 237a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (q->in) 238a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("in "); 239a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 240a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (q->out) 241a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("out "); 242a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 243a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 244a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (q->centroid) 245a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("centroid "); 246a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (q->uniform) 247a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("uniform "); 248a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (q->smooth) 249a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("smooth "); 250a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (q->flat) 251a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("flat "); 252a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (q->noperspective) 253a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("noperspective "); 254a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 255a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 256a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 257a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 258a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_node::print(void) const 259a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 26003d3f3ab71ba280071f54cb60505212be6710f8eIan Romanick printf("unhandled node "); 261a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 262a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 263a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 264a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_node::ast_node(void) 265a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 266ec9675ec533cc0c0c7b1c738280e9b9adf2591fbCarl Worth this->location.source = 0; 267ec9675ec533cc0c0c7b1c738280e9b9adf2591fbCarl Worth this->location.line = 0; 268ec9675ec533cc0c0c7b1c738280e9b9adf2591fbCarl Worth this->location.column = 0; 269a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 270a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 271a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 272a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickstatic void 273a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_opt_array_size_print(bool is_array, const ast_expression *array_size) 274a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 275a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (is_array) { 276a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("[ "); 277a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 278a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (array_size) 279a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick array_size->print(); 280a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 281a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("] "); 282a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 283a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 284a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 285a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 286a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 287a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_compound_statement::print(void) const 288a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 289a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("{\n"); 290a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 291304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick foreach_list_const(n, &this->statements) { 292304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick ast_node *ast = exec_node_data(ast_node, n, link); 293304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick ast->print(); 294a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 295a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 296a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("}\n"); 297a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 298a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 299a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 300a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_compound_statement::ast_compound_statement(int new_scope, 301a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *statements) 302a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 303a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->new_scope = new_scope; 304a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 305a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (statements != NULL) { 306304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick this->statements.push_degenerate_list_at_head(&statements->link); 307a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 308a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 309a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 310a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 311a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 312a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_expression::print(void) const 313a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 314a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick switch (oper) { 315a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_assign: 316a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_mul_assign: 317a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_div_assign: 318a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_mod_assign: 319a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_add_assign: 320a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_sub_assign: 321a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_ls_assign: 322a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_rs_assign: 323a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_and_assign: 324a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_xor_assign: 325a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_or_assign: 326a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick subexpressions[0]->print(); 32788349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick printf("%s ", operator_string(oper)); 328a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick subexpressions[1]->print(); 329a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 330a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 331a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_field_selection: 332a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick subexpressions[0]->print(); 333a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf(". %s ", primary_expression.identifier); 334a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 335a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 336a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_plus: 337a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_neg: 338a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_bit_not: 339a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_logic_not: 340a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_pre_inc: 341a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_pre_dec: 34288349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick printf("%s ", operator_string(oper)); 343a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick subexpressions[0]->print(); 344a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 345a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 346a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_post_inc: 347a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_post_dec: 348a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick subexpressions[0]->print(); 34988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick printf("%s ", operator_string(oper)); 350a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 351a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 352a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_conditional: 353a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick subexpressions[0]->print(); 354a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("? "); 355a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick subexpressions[1]->print(); 356a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf(": "); 357a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick subexpressions[1]->print(); 358a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 359a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 360a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_array_index: 361a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick subexpressions[0]->print(); 362a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("[ "); 363a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick subexpressions[1]->print(); 364a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("] "); 365a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 366a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 367a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_function_call: { 368a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick subexpressions[0]->print(); 369a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("( "); 370a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 371304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick foreach_list_const (n, &this->expressions) { 3722384937835c1cfbce8c6361ad0972761e17ae1a7Ian Romanick if (n != this->expressions.get_head()) 3732384937835c1cfbce8c6361ad0972761e17ae1a7Ian Romanick printf(", "); 374304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick 375304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick ast_node *ast = exec_node_data(ast_node, n, link); 376304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick ast->print(); 377a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 378a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 379a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf(") "); 380a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 381a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 382a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 383a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_identifier: 384a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("%s ", primary_expression.identifier); 385a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 386a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 387a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_int_constant: 388a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("%d ", primary_expression.int_constant); 389a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 390a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 391a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_uint_constant: 392a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("%u ", primary_expression.uint_constant); 393a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 394a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 395a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_float_constant: 396a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("%f ", primary_expression.float_constant); 397a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 398a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 399a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_bool_constant: 400a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("%s ", 401a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick primary_expression.bool_constant 402a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ? "true" : "false"); 403a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 404a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 405a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_sequence: { 406a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("( "); 407304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick foreach_list_const(n, & this->expressions) { 408304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick if (n != this->expressions.get_head()) 409a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf(", "); 410a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 411304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick ast_node *ast = exec_node_data(ast_node, n, link); 412304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick ast->print(); 413a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 414a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf(") "); 415a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 416a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 41788349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick 41888349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick default: 41988349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick assert(0); 42088349b22caa0ab0b44188dbb9e002549aadb0590Ian Romanick break; 421a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 422a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 423a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 424a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_expression::ast_expression(int oper, 425a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *ex0, 426a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *ex1, 427a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *ex2) 428a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 429a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->oper = ast_operators(oper); 430a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->subexpressions[0] = ex0; 431a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->subexpressions[1] = ex1; 432a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->subexpressions[2] = ex2; 433a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 434a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 435a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 436a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 437a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_expression_statement::print(void) const 438a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 439a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (expression) 440a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick expression->print(); 441a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 442a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("; "); 443a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 444a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 445a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 446a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_expression_statement::ast_expression_statement(ast_expression *ex) : 447a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick expression(ex) 448a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 449a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick /* empty */ 450a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 451a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 452a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 453a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 454a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_function::print(void) const 455a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 456a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick return_type->print(); 457a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf(" %s (", identifier); 458a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 459304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick foreach_list_const(n, & this->parameters) { 460304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick ast_node *ast = exec_node_data(ast_node, n, link); 461304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick ast->print(); 462a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 463a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 464a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf(")"); 465a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 466a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 467a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 468a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_function::ast_function(void) 46992318a947958892497722772b03c643ebc943294Ian Romanick : is_definition(false), signature(NULL) 470a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 471304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick /* empty */ 472a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 473a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 474a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 475a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 476a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_fully_specified_type::print(void) const 477a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 478a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick _mesa_ast_type_qualifier_print(& qualifier); 479a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick specifier->print(); 480a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 481a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 482a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 483a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 484a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_parameter_declarator::print(void) const 485a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 486a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick type->print(); 487a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (identifier) 488a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("%s ", identifier); 489a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_opt_array_size_print(is_array, array_size); 490a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 491a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 492a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 493a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 494a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_function_definition::print(void) const 495a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 496a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick prototype->print(); 497a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick body->print(); 498a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 499a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 500a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 501a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 502a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_declaration::print(void) const 503a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 504a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("%s ", identifier); 505a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_opt_array_size_print(is_array, array_size); 506a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 507a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (initializer) { 508a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("= "); 509a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick initializer->print(); 510a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 511a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 512a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 513a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 514a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_declaration::ast_declaration(char *identifier, int is_array, 515a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *array_size, 516a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *initializer) 517a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 518a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->identifier = identifier; 519a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->is_array = is_array; 520a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->array_size = array_size; 521a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->initializer = initializer; 522a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 523a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 524a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 525a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 526a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_declarator_list::print(void) const 527a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 528a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick assert(type || invariant); 529a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 530a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (type) 531a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick type->print(); 532a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick else 533a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("invariant "); 534a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 535304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick foreach_list_const (ptr, & this->declarations) { 536304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick if (ptr != this->declarations.get_head()) 537a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf(", "); 538a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 539304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick ast_node *ast = exec_node_data(ast_node, ptr, link); 540304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick ast->print(); 541a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 542a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 543a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("; "); 544a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 545a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 546a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 547a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_declarator_list::ast_declarator_list(ast_fully_specified_type *type) 548a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 549a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->type = type; 5503832706f81d7f5310882eda6d7ef0c3e39593b18Ian Romanick this->invariant = false; 551a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 552a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 553a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 554a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_jump_statement::print(void) const 555a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 556a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick switch (mode) { 557a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_continue: 558a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("continue; "); 559a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 560a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_break: 561a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("break; "); 562a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 563a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_return: 564a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("return "); 565a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (opt_return_value) 566a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick opt_return_value->print(); 567a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 568a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("; "); 569a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 570a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_discard: 571a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("discard; "); 572a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 573a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 574a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 575a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 576a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 577a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_jump_statement::ast_jump_statement(int mode, ast_expression *return_value) 578a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 579a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->mode = ast_jump_modes(mode); 580a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 581a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (mode == ast_return) 582a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick opt_return_value = return_value; 583a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 584a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 585a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 586a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 587a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_selection_statement::print(void) const 588a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 589a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("if ( "); 590a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick condition->print(); 591a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf(") "); 592a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 593a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick then_statement->print(); 594a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 595a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (else_statement) { 596a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("else "); 597a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick else_statement->print(); 598a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 599a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 600a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 601a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 602a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 603a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_selection_statement::ast_selection_statement(ast_expression *condition, 604a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *then_statement, 605a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *else_statement) 606a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 607a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->condition = condition; 608a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->then_statement = then_statement; 609a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->else_statement = else_statement; 610a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 611a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 612a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 613a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 614a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_iteration_statement::print(void) const 615a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 616a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick switch (mode) { 617a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_for: 618a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("for( "); 619a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (init_statement) 620a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick init_statement->print(); 621a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("; "); 622a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 623a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (condition) 624a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick condition->print(); 625a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("; "); 626a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 627a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (rest_expression) 628a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick rest_expression->print(); 629a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf(") "); 630a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 631a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick body->print(); 632a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 633a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 634a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_while: 635a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("while ( "); 636a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (condition) 637a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick condition->print(); 638a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf(") "); 639a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick body->print(); 640a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 641a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 642a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick case ast_do_while: 643a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("do "); 644a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick body->print(); 645a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("while ( "); 646a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick if (condition) 647a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick condition->print(); 648a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("); "); 649a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick break; 650a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 651a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 652a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 653a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 654a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_iteration_statement::ast_iteration_statement(int mode, 655a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *init, 656a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *condition, 657a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_expression *rest_expression, 658a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *body) 659a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 660a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->mode = ast_iteration_modes(mode); 661a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->init_statement = init; 662a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->condition = condition; 663a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->rest_expression = rest_expression; 664a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick this->body = body; 665a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 666a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 667a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 668a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickvoid 669a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_struct_specifier::print(void) const 670a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 671a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("struct %s { ", name); 672304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick foreach_list_const(n, &this->declarations) { 673304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick ast_node *ast = exec_node_data(ast_node, n, link); 674304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick ast->print(); 675a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick } 676a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick printf("} "); 677a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 678a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 679a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick 680a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanickast_struct_specifier::ast_struct_specifier(char *identifier, 681a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick ast_node *declarator_list) 682a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick{ 683ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke if (identifier == NULL) { 684ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke static unsigned anon_count = 1; 685ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke identifier = talloc_asprintf(this, "#anon_struct_%04x", anon_count); 686ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke anon_count++; 687ca92ae2699c4aad21c0811b9a5562b9223816cafKenneth Graunke } 688a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick name = identifier; 689304ea90233baeac6801a98e981658cb7a2d2501cIan Romanick this->declarations.push_degenerate_list_at_head(&declarator_list->link); 690a87ac255cf7ef0672b4de865d82e6a40c93b57dIan Romanick} 6912f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt 6922f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholtbool 693e591c4625cae63660c5000fbab366e40fe154ab0Luca Barbierido_common_optimization(exec_list *ir, bool linked, unsigned max_unroll_iterations) 6942f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt{ 6952f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt GLboolean progress = GL_FALSE; 6962f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt 6972f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_sub_to_add_neg(ir) || progress; 6982f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt 6992f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt if (linked) { 7002f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_function_inlining(ir) || progress; 7012f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_dead_functions(ir) || progress; 7022f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt } 7032f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_structure_splitting(ir) || progress; 7042f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_if_simplification(ir) || progress; 7052f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_copy_propagation(ir) || progress; 7062f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt if (linked) 7072f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_dead_code(ir) || progress; 7082f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt else 7092f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_dead_code_unlinked(ir) || progress; 7102f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_dead_code_local(ir) || progress; 7112f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_tree_grafting(ir) || progress; 7122f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_constant_propagation(ir) || progress; 7132f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt if (linked) 7142f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_constant_variable(ir) || progress; 7152f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt else 7162f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_constant_variable_unlinked(ir) || progress; 7172f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_constant_folding(ir) || progress; 7182f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_algebraic(ir) || progress; 7193361cbac2a883818efeb2b3e27405eeefce60f63Luca Barbieri progress = do_lower_jumps(ir) || progress; 7202f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_vec_index_to_swizzle(ir) || progress; 7212f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt progress = do_swizzle_swizzle(ir) || progress; 7228f8cdbfba43550d0b8985fb087961864e4cd92b6Eric Anholt progress = do_noop_swizzle(ir) || progress; 7232f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt 7248f2214f4892acb994d13531d555196bd8f242dadIan Romanick progress = optimize_redundant_jumps(ir) || progress; 7258f2214f4892acb994d13531d555196bd8f242dadIan Romanick 7268df2dbf91ddfd0c1590e33015e85470b67e69319Ian Romanick loop_state *ls = analyze_loop_variables(ir); 7278df2dbf91ddfd0c1590e33015e85470b67e69319Ian Romanick progress = set_loop_controls(ir, ls) || progress; 728e591c4625cae63660c5000fbab366e40fe154ab0Luca Barbieri progress = unroll_loops(ir, ls, max_unroll_iterations) || progress; 7298df2dbf91ddfd0c1590e33015e85470b67e69319Ian Romanick delete ls; 7308df2dbf91ddfd0c1590e33015e85470b67e69319Ian Romanick 7312f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt return progress; 7322f4fe151681a6f6afe1d452eece6cf4144f44e49Eric Anholt} 733b83846475bac76268d75f53632faf8aad8cad02cEric Anholt 734b83846475bac76268d75f53632faf8aad8cad02cEric Anholtextern "C" { 735b83846475bac76268d75f53632faf8aad8cad02cEric Anholt 736b83846475bac76268d75f53632faf8aad8cad02cEric Anholt/** 737b83846475bac76268d75f53632faf8aad8cad02cEric Anholt * To be called at GL teardown time, this frees compiler datastructures. 738b83846475bac76268d75f53632faf8aad8cad02cEric Anholt * 739b83846475bac76268d75f53632faf8aad8cad02cEric Anholt * After calling this, any previously compiled shaders and shader 740b83846475bac76268d75f53632faf8aad8cad02cEric Anholt * programs would be invalid. So this should happen at approximately 741b83846475bac76268d75f53632faf8aad8cad02cEric Anholt * program exit. 742b83846475bac76268d75f53632faf8aad8cad02cEric Anholt */ 743b83846475bac76268d75f53632faf8aad8cad02cEric Anholtvoid 744b83846475bac76268d75f53632faf8aad8cad02cEric Anholt_mesa_destroy_shader_compiler(void) 745b83846475bac76268d75f53632faf8aad8cad02cEric Anholt{ 746b83846475bac76268d75f53632faf8aad8cad02cEric Anholt _mesa_destroy_shader_compiler_caches(); 747b83846475bac76268d75f53632faf8aad8cad02cEric Anholt 748b83846475bac76268d75f53632faf8aad8cad02cEric Anholt _mesa_glsl_release_types(); 749b83846475bac76268d75f53632faf8aad8cad02cEric Anholt} 750b83846475bac76268d75f53632faf8aad8cad02cEric Anholt 751b83846475bac76268d75f53632faf8aad8cad02cEric Anholt/** 752b83846475bac76268d75f53632faf8aad8cad02cEric Anholt * Releases compiler caches to trade off performance for memory. 753b83846475bac76268d75f53632faf8aad8cad02cEric Anholt * 754b83846475bac76268d75f53632faf8aad8cad02cEric Anholt * Intended to be used with glReleaseShaderCompiler(). 755b83846475bac76268d75f53632faf8aad8cad02cEric Anholt */ 756b83846475bac76268d75f53632faf8aad8cad02cEric Anholtvoid 757b83846475bac76268d75f53632faf8aad8cad02cEric Anholt_mesa_destroy_shader_compiler_caches(void) 758b83846475bac76268d75f53632faf8aad8cad02cEric Anholt{ 759b83846475bac76268d75f53632faf8aad8cad02cEric Anholt _mesa_glsl_release_functions(); 760b83846475bac76268d75f53632faf8aad8cad02cEric Anholt} 761b83846475bac76268d75f53632faf8aad8cad02cEric Anholt 762b83846475bac76268d75f53632faf8aad8cad02cEric Anholt} 763