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