Subversion Repositories Kolibri OS

Rev

Blame | Last modification | View Log | RSS feed

  1. /*
  2.  * Copyright © 2008, 2009 Intel Corporation
  3.  *
  4.  * Permission is hereby granted, free of charge, to any person obtaining a
  5.  * copy of this software and associated documentation files (the "Software"),
  6.  * to deal in the Software without restriction, including without limitation
  7.  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
  8.  * and/or sell copies of the Software, and to permit persons to whom the
  9.  * Software is furnished to do so, subject to the following conditions:
  10.  *
  11.  * The above copyright notice and this permission notice (including the next
  12.  * paragraph) shall be included in all copies or substantial portions of the
  13.  * Software.
  14.  *
  15.  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16.  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17.  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
  18.  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19.  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20.  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  21.  * DEALINGS IN THE SOFTWARE.
  22.  */
  23. #include <stdio.h>
  24. #include <stdarg.h>
  25. #include <string.h>
  26. #include <assert.h>
  27.  
  28. #include "main/core.h" /* for struct gl_context */
  29. #include "main/context.h"
  30. #include "main/shaderobj.h"
  31. #include "util/u_atomic.h" /* for p_atomic_cmpxchg */
  32. #include "util/ralloc.h"
  33. #include "ast.h"
  34. #include "glsl_parser_extras.h"
  35. #include "glsl_parser.h"
  36. #include "ir_optimization.h"
  37. #include "loop_analysis.h"
  38.  
  39. /**
  40.  * Format a short human-readable description of the given GLSL version.
  41.  */
  42. const char *
  43. glsl_compute_version_string(void *mem_ctx, bool is_es, unsigned version)
  44. {
  45.    return ralloc_asprintf(mem_ctx, "GLSL%s %d.%02d", is_es ? " ES" : "",
  46.                           version / 100, version % 100);
  47. }
  48.  
  49.  
  50. static const unsigned known_desktop_glsl_versions[] =
  51.    { 110, 120, 130, 140, 150, 330, 400, 410, 420, 430, 440, 450 };
  52.  
  53.  
  54. _mesa_glsl_parse_state::_mesa_glsl_parse_state(struct gl_context *_ctx,
  55.                                                gl_shader_stage stage,
  56.                                                void *mem_ctx)
  57.    : ctx(_ctx), cs_input_local_size_specified(false), cs_input_local_size(),
  58.      switch_state()
  59. {
  60.    assert(stage < MESA_SHADER_STAGES);
  61.    this->stage = stage;
  62.  
  63.    this->scanner = NULL;
  64.    this->translation_unit.make_empty();
  65.    this->symbols = new(mem_ctx) glsl_symbol_table;
  66.  
  67.    this->info_log = ralloc_strdup(mem_ctx, "");
  68.    this->error = false;
  69.    this->loop_nesting_ast = NULL;
  70.  
  71.    this->struct_specifier_depth = 0;
  72.  
  73.    this->uses_builtin_functions = false;
  74.  
  75.    /* Set default language version and extensions */
  76.    this->language_version = 110;
  77.    this->forced_language_version = ctx->Const.ForceGLSLVersion;
  78.    this->es_shader = false;
  79.    this->ARB_texture_rectangle_enable = true;
  80.  
  81.    /* OpenGL ES 2.0 has different defaults from desktop GL. */
  82.    if (ctx->API == API_OPENGLES2) {
  83.       this->language_version = 100;
  84.       this->es_shader = true;
  85.       this->ARB_texture_rectangle_enable = false;
  86.    }
  87.  
  88.    this->extensions = &ctx->Extensions;
  89.  
  90.    this->Const.MaxLights = ctx->Const.MaxLights;
  91.    this->Const.MaxClipPlanes = ctx->Const.MaxClipPlanes;
  92.    this->Const.MaxTextureUnits = ctx->Const.MaxTextureUnits;
  93.    this->Const.MaxTextureCoords = ctx->Const.MaxTextureCoordUnits;
  94.    this->Const.MaxVertexAttribs = ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs;
  95.    this->Const.MaxVertexUniformComponents = ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents;
  96.    this->Const.MaxVertexTextureImageUnits = ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits;
  97.    this->Const.MaxCombinedTextureImageUnits = ctx->Const.MaxCombinedTextureImageUnits;
  98.    this->Const.MaxTextureImageUnits = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits;
  99.    this->Const.MaxFragmentUniformComponents = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents;
  100.    this->Const.MinProgramTexelOffset = ctx->Const.MinProgramTexelOffset;
  101.    this->Const.MaxProgramTexelOffset = ctx->Const.MaxProgramTexelOffset;
  102.  
  103.    this->Const.MaxDrawBuffers = ctx->Const.MaxDrawBuffers;
  104.  
  105.    /* 1.50 constants */
  106.    this->Const.MaxVertexOutputComponents = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents;
  107.    this->Const.MaxGeometryInputComponents = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxInputComponents;
  108.    this->Const.MaxGeometryOutputComponents = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxOutputComponents;
  109.    this->Const.MaxFragmentInputComponents = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents;
  110.    this->Const.MaxGeometryTextureImageUnits = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits;
  111.    this->Const.MaxGeometryOutputVertices = ctx->Const.MaxGeometryOutputVertices;
  112.    this->Const.MaxGeometryTotalOutputComponents = ctx->Const.MaxGeometryTotalOutputComponents;
  113.    this->Const.MaxGeometryUniformComponents = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxUniformComponents;
  114.  
  115.    this->Const.MaxVertexAtomicCounters = ctx->Const.Program[MESA_SHADER_VERTEX].MaxAtomicCounters;
  116.    this->Const.MaxGeometryAtomicCounters = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxAtomicCounters;
  117.    this->Const.MaxFragmentAtomicCounters = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicCounters;
  118.    this->Const.MaxCombinedAtomicCounters = ctx->Const.MaxCombinedAtomicCounters;
  119.    this->Const.MaxAtomicBufferBindings = ctx->Const.MaxAtomicBufferBindings;
  120.    this->Const.MaxVertexAtomicCounterBuffers =
  121.       ctx->Const.Program[MESA_SHADER_VERTEX].MaxAtomicBuffers;
  122.    this->Const.MaxGeometryAtomicCounterBuffers =
  123.       ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxAtomicBuffers;
  124.    this->Const.MaxFragmentAtomicCounterBuffers =
  125.       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxAtomicBuffers;
  126.    this->Const.MaxCombinedAtomicCounterBuffers =
  127.       ctx->Const.MaxCombinedAtomicBuffers;
  128.    this->Const.MaxAtomicCounterBufferSize =
  129.       ctx->Const.MaxAtomicBufferSize;
  130.  
  131.    /* Compute shader constants */
  132.    for (unsigned i = 0; i < ARRAY_SIZE(this->Const.MaxComputeWorkGroupCount); i++)
  133.       this->Const.MaxComputeWorkGroupCount[i] = ctx->Const.MaxComputeWorkGroupCount[i];
  134.    for (unsigned i = 0; i < ARRAY_SIZE(this->Const.MaxComputeWorkGroupSize); i++)
  135.       this->Const.MaxComputeWorkGroupSize[i] = ctx->Const.MaxComputeWorkGroupSize[i];
  136.  
  137.    this->Const.MaxImageUnits = ctx->Const.MaxImageUnits;
  138.    this->Const.MaxCombinedImageUnitsAndFragmentOutputs = ctx->Const.MaxCombinedImageUnitsAndFragmentOutputs;
  139.    this->Const.MaxImageSamples = ctx->Const.MaxImageSamples;
  140.    this->Const.MaxVertexImageUniforms = ctx->Const.Program[MESA_SHADER_VERTEX].MaxImageUniforms;
  141.    this->Const.MaxGeometryImageUniforms = ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxImageUniforms;
  142.    this->Const.MaxFragmentImageUniforms = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxImageUniforms;
  143.    this->Const.MaxCombinedImageUniforms = ctx->Const.MaxCombinedImageUniforms;
  144.  
  145.    /* ARB_viewport_array */
  146.    this->Const.MaxViewports = ctx->Const.MaxViewports;
  147.  
  148.    this->current_function = NULL;
  149.    this->toplevel_ir = NULL;
  150.    this->found_return = false;
  151.    this->all_invariant = false;
  152.    this->user_structures = NULL;
  153.    this->num_user_structures = 0;
  154.  
  155.    /* supported_versions should be large enough to support the known desktop
  156.     * GLSL versions plus 3 GLES versions (ES 1.00, ES 3.00, and ES 3.10))
  157.     */
  158.    STATIC_ASSERT((ARRAY_SIZE(known_desktop_glsl_versions) + 3) ==
  159.                  ARRAY_SIZE(this->supported_versions));
  160.  
  161.    /* Populate the list of supported GLSL versions */
  162.    /* FINISHME: Once the OpenGL 3.0 'forward compatible' context or
  163.     * the OpenGL 3.2 Core context is supported, this logic will need
  164.     * change.  Older versions of GLSL are no longer supported
  165.     * outside the compatibility contexts of 3.x.
  166.     */
  167.    this->num_supported_versions = 0;
  168.    if (_mesa_is_desktop_gl(ctx)) {
  169.       for (unsigned i = 0; i < ARRAY_SIZE(known_desktop_glsl_versions); i++) {
  170.          if (known_desktop_glsl_versions[i] <= ctx->Const.GLSLVersion) {
  171.             this->supported_versions[this->num_supported_versions].ver
  172.                = known_desktop_glsl_versions[i];
  173.             this->supported_versions[this->num_supported_versions].es = false;
  174.             this->num_supported_versions++;
  175.          }
  176.       }
  177.    }
  178.    if (ctx->API == API_OPENGLES2 || ctx->Extensions.ARB_ES2_compatibility) {
  179.       this->supported_versions[this->num_supported_versions].ver = 100;
  180.       this->supported_versions[this->num_supported_versions].es = true;
  181.       this->num_supported_versions++;
  182.    }
  183.    if (_mesa_is_gles3(ctx) || ctx->Extensions.ARB_ES3_compatibility) {
  184.       this->supported_versions[this->num_supported_versions].ver = 300;
  185.       this->supported_versions[this->num_supported_versions].es = true;
  186.       this->num_supported_versions++;
  187.    }
  188.    if (_mesa_is_gles31(ctx)) {
  189.       this->supported_versions[this->num_supported_versions].ver = 310;
  190.       this->supported_versions[this->num_supported_versions].es = true;
  191.       this->num_supported_versions++;
  192.    }
  193.  
  194.    /* Create a string for use in error messages to tell the user which GLSL
  195.     * versions are supported.
  196.     */
  197.    char *supported = ralloc_strdup(this, "");
  198.    for (unsigned i = 0; i < this->num_supported_versions; i++) {
  199.       unsigned ver = this->supported_versions[i].ver;
  200.       const char *const prefix = (i == 0)
  201.          ? ""
  202.          : ((i == this->num_supported_versions - 1) ? ", and " : ", ");
  203.       const char *const suffix = (this->supported_versions[i].es) ? " ES" : "";
  204.  
  205.       ralloc_asprintf_append(& supported, "%s%u.%02u%s",
  206.                              prefix,
  207.                              ver / 100, ver % 100,
  208.                              suffix);
  209.    }
  210.  
  211.    this->supported_version_string = supported;
  212.  
  213.    if (ctx->Const.ForceGLSLExtensionsWarn)
  214.       _mesa_glsl_process_extension("all", NULL, "warn", NULL, this);
  215.  
  216.    this->default_uniform_qualifier = new(this) ast_type_qualifier();
  217.    this->default_uniform_qualifier->flags.q.shared = 1;
  218.    this->default_uniform_qualifier->flags.q.column_major = 1;
  219.  
  220.    this->fs_uses_gl_fragcoord = false;
  221.    this->fs_redeclares_gl_fragcoord = false;
  222.    this->fs_origin_upper_left = false;
  223.    this->fs_pixel_center_integer = false;
  224.    this->fs_redeclares_gl_fragcoord_with_no_layout_qualifiers = false;
  225.  
  226.    this->gs_input_prim_type_specified = false;
  227.    this->gs_input_size = 0;
  228.    this->in_qualifier = new(this) ast_type_qualifier();
  229.    this->out_qualifier = new(this) ast_type_qualifier();
  230.    this->fs_early_fragment_tests = false;
  231.    memset(this->atomic_counter_offsets, 0,
  232.           sizeof(this->atomic_counter_offsets));
  233.    this->allow_extension_directive_midshader =
  234.       ctx->Const.AllowGLSLExtensionDirectiveMidShader;
  235. }
  236.  
  237. /**
  238.  * Determine whether the current GLSL version is sufficiently high to support
  239.  * a certain feature, and generate an error message if it isn't.
  240.  *
  241.  * \param required_glsl_version and \c required_glsl_es_version are
  242.  * interpreted as they are in _mesa_glsl_parse_state::is_version().
  243.  *
  244.  * \param locp is the parser location where the error should be reported.
  245.  *
  246.  * \param fmt (and additional arguments) constitute a printf-style error
  247.  * message to report if the version check fails.  Information about the
  248.  * current and required GLSL versions will be appended.  So, for example, if
  249.  * the GLSL version being compiled is 1.20, and check_version(130, 300, locp,
  250.  * "foo unsupported") is called, the error message will be "foo unsupported in
  251.  * GLSL 1.20 (GLSL 1.30 or GLSL 3.00 ES required)".
  252.  */
  253. bool
  254. _mesa_glsl_parse_state::check_version(unsigned required_glsl_version,
  255.                                       unsigned required_glsl_es_version,
  256.                                       YYLTYPE *locp, const char *fmt, ...)
  257. {
  258.    if (this->is_version(required_glsl_version, required_glsl_es_version))
  259.       return true;
  260.  
  261.    va_list args;
  262.    va_start(args, fmt);
  263.    char *problem = ralloc_vasprintf(this, fmt, args);
  264.    va_end(args);
  265.    const char *glsl_version_string
  266.       = glsl_compute_version_string(this, false, required_glsl_version);
  267.    const char *glsl_es_version_string
  268.       = glsl_compute_version_string(this, true, required_glsl_es_version);
  269.    const char *requirement_string = "";
  270.    if (required_glsl_version && required_glsl_es_version) {
  271.       requirement_string = ralloc_asprintf(this, " (%s or %s required)",
  272.                                            glsl_version_string,
  273.                                            glsl_es_version_string);
  274.    } else if (required_glsl_version) {
  275.       requirement_string = ralloc_asprintf(this, " (%s required)",
  276.                                            glsl_version_string);
  277.    } else if (required_glsl_es_version) {
  278.       requirement_string = ralloc_asprintf(this, " (%s required)",
  279.                                            glsl_es_version_string);
  280.    }
  281.    _mesa_glsl_error(locp, this, "%s in %s%s",
  282.                     problem, this->get_version_string(),
  283.                     requirement_string);
  284.  
  285.    return false;
  286. }
  287.  
  288. /**
  289.  * Process a GLSL #version directive.
  290.  *
  291.  * \param version is the integer that follows the #version token.
  292.  *
  293.  * \param ident is a string identifier that follows the integer, if any is
  294.  * present.  Otherwise NULL.
  295.  */
  296. void
  297. _mesa_glsl_parse_state::process_version_directive(YYLTYPE *locp, int version,
  298.                                                   const char *ident)
  299. {
  300.    bool es_token_present = false;
  301.    if (ident) {
  302.       if (strcmp(ident, "es") == 0) {
  303.          es_token_present = true;
  304.       } else if (version >= 150) {
  305.          if (strcmp(ident, "core") == 0) {
  306.             /* Accept the token.  There's no need to record that this is
  307.              * a core profile shader since that's the only profile we support.
  308.              */
  309.          } else if (strcmp(ident, "compatibility") == 0) {
  310.             _mesa_glsl_error(locp, this,
  311.                              "the compatibility profile is not supported");
  312.          } else {
  313.             _mesa_glsl_error(locp, this,
  314.                              "\"%s\" is not a valid shading language profile; "
  315.                              "if present, it must be \"core\"", ident);
  316.          }
  317.       } else {
  318.          _mesa_glsl_error(locp, this,
  319.                           "illegal text following version number");
  320.       }
  321.    }
  322.  
  323.    this->es_shader = es_token_present;
  324.    if (version == 100) {
  325.       if (es_token_present) {
  326.          _mesa_glsl_error(locp, this,
  327.                           "GLSL 1.00 ES should be selected using "
  328.                           "`#version 100'");
  329.       } else {
  330.          this->es_shader = true;
  331.       }
  332.    }
  333.  
  334.    if (this->es_shader) {
  335.       this->ARB_texture_rectangle_enable = false;
  336.    }
  337.  
  338.    if (this->forced_language_version)
  339.       this->language_version = this->forced_language_version;
  340.    else
  341.       this->language_version = version;
  342.  
  343.    bool supported = false;
  344.    for (unsigned i = 0; i < this->num_supported_versions; i++) {
  345.       if (this->supported_versions[i].ver == this->language_version
  346.           && this->supported_versions[i].es == this->es_shader) {
  347.          supported = true;
  348.          break;
  349.       }
  350.    }
  351.  
  352.    if (!supported) {
  353.       _mesa_glsl_error(locp, this, "%s is not supported. "
  354.                        "Supported versions are: %s",
  355.                        this->get_version_string(),
  356.                        this->supported_version_string);
  357.  
  358.       /* On exit, the language_version must be set to a valid value.
  359.        * Later calls to _mesa_glsl_initialize_types will misbehave if
  360.        * the version is invalid.
  361.        */
  362.       switch (this->ctx->API) {
  363.       case API_OPENGL_COMPAT:
  364.       case API_OPENGL_CORE:
  365.          this->language_version = this->ctx->Const.GLSLVersion;
  366.          break;
  367.  
  368.       case API_OPENGLES:
  369.          assert(!"Should not get here.");
  370.          /* FALLTHROUGH */
  371.  
  372.       case API_OPENGLES2:
  373.          this->language_version = 100;
  374.          break;
  375.       }
  376.    }
  377. }
  378.  
  379.  
  380. /**
  381.  * Translate a gl_shader_stage to a short shader stage name for debug
  382.  * printouts and error messages.
  383.  */
  384. const char *
  385. _mesa_shader_stage_to_string(unsigned stage)
  386. {
  387.    switch (stage) {
  388.    case MESA_SHADER_VERTEX:   return "vertex";
  389.    case MESA_SHADER_FRAGMENT: return "fragment";
  390.    case MESA_SHADER_GEOMETRY: return "geometry";
  391.    case MESA_SHADER_COMPUTE:  return "compute";
  392.    }
  393.  
  394.    unreachable("Unknown shader stage.");
  395. }
  396.  
  397. /**
  398.  * Translate a gl_shader_stage to a shader stage abbreviation (VS, GS, FS)
  399.  * for debug printouts and error messages.
  400.  */
  401. const char *
  402. _mesa_shader_stage_to_abbrev(unsigned stage)
  403. {
  404.    switch (stage) {
  405.    case MESA_SHADER_VERTEX:   return "VS";
  406.    case MESA_SHADER_FRAGMENT: return "FS";
  407.    case MESA_SHADER_GEOMETRY: return "GS";
  408.    case MESA_SHADER_COMPUTE:  return "CS";
  409.    }
  410.  
  411.    unreachable("Unknown shader stage.");
  412. }
  413.  
  414. /* This helper function will append the given message to the shader's
  415.    info log and report it via GL_ARB_debug_output. Per that extension,
  416.    'type' is one of the enum values classifying the message, and
  417.    'id' is the implementation-defined ID of the given message. */
  418. static void
  419. _mesa_glsl_msg(const YYLTYPE *locp, _mesa_glsl_parse_state *state,
  420.                GLenum type, const char *fmt, va_list ap)
  421. {
  422.    bool error = (type == MESA_DEBUG_TYPE_ERROR);
  423.    GLuint msg_id = 0;
  424.  
  425.    assert(state->info_log != NULL);
  426.  
  427.    /* Get the offset that the new message will be written to. */
  428.    int msg_offset = strlen(state->info_log);
  429.  
  430.    ralloc_asprintf_append(&state->info_log, "%u:%u(%u): %s: ",
  431.                                             locp->source,
  432.                                             locp->first_line,
  433.                                             locp->first_column,
  434.                                             error ? "error" : "warning");
  435.    ralloc_vasprintf_append(&state->info_log, fmt, ap);
  436.  
  437.    const char *const msg = &state->info_log[msg_offset];
  438.    struct gl_context *ctx = state->ctx;
  439.  
  440.    /* Report the error via GL_ARB_debug_output. */
  441.    _mesa_shader_debug(ctx, type, &msg_id, msg, strlen(msg));
  442.  
  443.    ralloc_strcat(&state->info_log, "\n");
  444. }
  445.  
  446. void
  447. _mesa_glsl_error(YYLTYPE *locp, _mesa_glsl_parse_state *state,
  448.                  const char *fmt, ...)
  449. {
  450.    va_list ap;
  451.  
  452.    state->error = true;
  453.  
  454.    va_start(ap, fmt);
  455.    _mesa_glsl_msg(locp, state, MESA_DEBUG_TYPE_ERROR, fmt, ap);
  456.    va_end(ap);
  457. }
  458.  
  459.  
  460. void
  461. _mesa_glsl_warning(const YYLTYPE *locp, _mesa_glsl_parse_state *state,
  462.                    const char *fmt, ...)
  463. {
  464.    va_list ap;
  465.  
  466.    va_start(ap, fmt);
  467.    _mesa_glsl_msg(locp, state, MESA_DEBUG_TYPE_OTHER, fmt, ap);
  468.    va_end(ap);
  469. }
  470.  
  471.  
  472. /**
  473.  * Enum representing the possible behaviors that can be specified in
  474.  * an #extension directive.
  475.  */
  476. enum ext_behavior {
  477.    extension_disable,
  478.    extension_enable,
  479.    extension_require,
  480.    extension_warn
  481. };
  482.  
  483. /**
  484.  * Element type for _mesa_glsl_supported_extensions
  485.  */
  486. struct _mesa_glsl_extension {
  487.    /**
  488.     * Name of the extension when referred to in a GLSL extension
  489.     * statement
  490.     */
  491.    const char *name;
  492.  
  493.    /** True if this extension is available to desktop GL shaders */
  494.    bool avail_in_GL;
  495.  
  496.    /** True if this extension is available to GLES shaders */
  497.    bool avail_in_ES;
  498.  
  499.    /**
  500.     * Flag in the gl_extensions struct indicating whether this
  501.     * extension is supported by the driver, or
  502.     * &gl_extensions::dummy_true if supported by all drivers.
  503.     *
  504.     * Note: the type (GLboolean gl_extensions::*) is a "pointer to
  505.     * member" type, the type-safe alternative to the "offsetof" macro.
  506.     * In a nutshell:
  507.     *
  508.     * - foo bar::* p declares p to be an "offset" to a field of type
  509.     *   foo that exists within struct bar
  510.     * - &bar::baz computes the "offset" of field baz within struct bar
  511.     * - x.*p accesses the field of x that exists at "offset" p
  512.     * - x->*p is equivalent to (*x).*p
  513.     */
  514.    const GLboolean gl_extensions::* supported_flag;
  515.  
  516.    /**
  517.     * Flag in the _mesa_glsl_parse_state struct that should be set
  518.     * when this extension is enabled.
  519.     *
  520.     * See note in _mesa_glsl_extension::supported_flag about "pointer
  521.     * to member" types.
  522.     */
  523.    bool _mesa_glsl_parse_state::* enable_flag;
  524.  
  525.    /**
  526.     * Flag in the _mesa_glsl_parse_state struct that should be set
  527.     * when the shader requests "warn" behavior for this extension.
  528.     *
  529.     * See note in _mesa_glsl_extension::supported_flag about "pointer
  530.     * to member" types.
  531.     */
  532.    bool _mesa_glsl_parse_state::* warn_flag;
  533.  
  534.  
  535.    bool compatible_with_state(const _mesa_glsl_parse_state *state) const;
  536.    void set_flags(_mesa_glsl_parse_state *state, ext_behavior behavior) const;
  537. };
  538.  
  539. #define EXT(NAME, GL, ES, SUPPORTED_FLAG)                   \
  540.    { "GL_" #NAME, GL, ES, &gl_extensions::SUPPORTED_FLAG,   \
  541.          &_mesa_glsl_parse_state::NAME##_enable,            \
  542.          &_mesa_glsl_parse_state::NAME##_warn }
  543.  
  544. /**
  545.  * Table of extensions that can be enabled/disabled within a shader,
  546.  * and the conditions under which they are supported.
  547.  */
  548. static const _mesa_glsl_extension _mesa_glsl_supported_extensions[] = {
  549.    /*                                  API availability */
  550.    /* name                             GL     ES         supported flag */
  551.  
  552.    /* ARB extensions go here, sorted alphabetically.
  553.     */
  554.    EXT(ARB_arrays_of_arrays,           true,  false,     ARB_arrays_of_arrays),
  555.    EXT(ARB_compute_shader,             true,  false,     ARB_compute_shader),
  556.    EXT(ARB_conservative_depth,         true,  false,     ARB_conservative_depth),
  557.    EXT(ARB_derivative_control,         true,  false,     ARB_derivative_control),
  558.    EXT(ARB_draw_buffers,               true,  false,     dummy_true),
  559.    EXT(ARB_draw_instanced,             true,  false,     ARB_draw_instanced),
  560.    EXT(ARB_explicit_attrib_location,   true,  false,     ARB_explicit_attrib_location),
  561.    EXT(ARB_explicit_uniform_location,  true,  false,     ARB_explicit_uniform_location),
  562.    EXT(ARB_fragment_coord_conventions, true,  false,     ARB_fragment_coord_conventions),
  563.    EXT(ARB_fragment_layer_viewport,    true,  false,     ARB_fragment_layer_viewport),
  564.    EXT(ARB_gpu_shader5,                true,  false,     ARB_gpu_shader5),
  565.    EXT(ARB_gpu_shader_fp64,            true,  false,     ARB_gpu_shader_fp64),
  566.    EXT(ARB_sample_shading,             true,  false,     ARB_sample_shading),
  567.    EXT(ARB_separate_shader_objects,    true,  false,     dummy_true),
  568.    EXT(ARB_shader_atomic_counters,     true,  false,     ARB_shader_atomic_counters),
  569.    EXT(ARB_shader_bit_encoding,        true,  false,     ARB_shader_bit_encoding),
  570.    EXT(ARB_shader_image_load_store,    true,  false,     ARB_shader_image_load_store),
  571.    EXT(ARB_shader_precision,           true,  false,     ARB_shader_precision),
  572.    EXT(ARB_shader_stencil_export,      true,  false,     ARB_shader_stencil_export),
  573.    EXT(ARB_shader_texture_lod,         true,  false,     ARB_shader_texture_lod),
  574.    EXT(ARB_shading_language_420pack,   true,  false,     ARB_shading_language_420pack),
  575.    EXT(ARB_shading_language_packing,   true,  false,     ARB_shading_language_packing),
  576.    EXT(ARB_texture_cube_map_array,     true,  false,     ARB_texture_cube_map_array),
  577.    EXT(ARB_texture_gather,             true,  false,     ARB_texture_gather),
  578.    EXT(ARB_texture_multisample,        true,  false,     ARB_texture_multisample),
  579.    EXT(ARB_texture_query_levels,       true,  false,     ARB_texture_query_levels),
  580.    EXT(ARB_texture_query_lod,          true,  false,     ARB_texture_query_lod),
  581.    EXT(ARB_texture_rectangle,          true,  false,     dummy_true),
  582.    EXT(ARB_uniform_buffer_object,      true,  false,     ARB_uniform_buffer_object),
  583.    EXT(ARB_vertex_attrib_64bit,        true,  false,     ARB_vertex_attrib_64bit),
  584.    EXT(ARB_viewport_array,             true,  false,     ARB_viewport_array),
  585.  
  586.    /* KHR extensions go here, sorted alphabetically.
  587.     */
  588.  
  589.    /* OES extensions go here, sorted alphabetically.
  590.     */
  591.    EXT(OES_EGL_image_external,         false, true,      OES_EGL_image_external),
  592.    EXT(OES_standard_derivatives,       false, true,      OES_standard_derivatives),
  593.    EXT(OES_texture_3D,                 false, true,      EXT_texture3D),
  594.  
  595.    /* All other extensions go here, sorted alphabetically.
  596.     */
  597.    EXT(AMD_conservative_depth,         true,  false,     ARB_conservative_depth),
  598.    EXT(AMD_shader_stencil_export,      true,  false,     ARB_shader_stencil_export),
  599.    EXT(AMD_shader_trinary_minmax,      true,  false,     dummy_true),
  600.    EXT(AMD_vertex_shader_layer,        true,  false,     AMD_vertex_shader_layer),
  601.    EXT(AMD_vertex_shader_viewport_index, true,  false,   AMD_vertex_shader_viewport_index),
  602.    EXT(EXT_draw_buffers,               false,  true,     dummy_true),
  603.    EXT(EXT_separate_shader_objects,    false, true,      dummy_true),
  604.    EXT(EXT_shader_integer_mix,         true,  true,      EXT_shader_integer_mix),
  605.    EXT(EXT_texture_array,              true,  false,     EXT_texture_array),
  606. };
  607.  
  608. #undef EXT
  609.  
  610.  
  611. /**
  612.  * Determine whether a given extension is compatible with the target,
  613.  * API, and extension information in the current parser state.
  614.  */
  615. bool _mesa_glsl_extension::compatible_with_state(const _mesa_glsl_parse_state *
  616.                                                  state) const
  617. {
  618.    /* Check that this extension matches whether we are compiling
  619.     * for desktop GL or GLES.
  620.     */
  621.    if (state->es_shader) {
  622.       if (!this->avail_in_ES) return false;
  623.    } else {
  624.       if (!this->avail_in_GL) return false;
  625.    }
  626.  
  627.    /* Check that this extension is supported by the OpenGL
  628.     * implementation.
  629.     *
  630.     * Note: the ->* operator indexes into state->extensions by the
  631.     * offset this->supported_flag.  See
  632.     * _mesa_glsl_extension::supported_flag for more info.
  633.     */
  634.    return state->extensions->*(this->supported_flag);
  635. }
  636.  
  637. /**
  638.  * Set the appropriate flags in the parser state to establish the
  639.  * given behavior for this extension.
  640.  */
  641. void _mesa_glsl_extension::set_flags(_mesa_glsl_parse_state *state,
  642.                                      ext_behavior behavior) const
  643. {
  644.    /* Note: the ->* operator indexes into state by the
  645.     * offsets this->enable_flag and this->warn_flag.  See
  646.     * _mesa_glsl_extension::supported_flag for more info.
  647.     */
  648.    state->*(this->enable_flag) = (behavior != extension_disable);
  649.    state->*(this->warn_flag)   = (behavior == extension_warn);
  650. }
  651.  
  652. /**
  653.  * Find an extension by name in _mesa_glsl_supported_extensions.  If
  654.  * the name is not found, return NULL.
  655.  */
  656. static const _mesa_glsl_extension *find_extension(const char *name)
  657. {
  658.    for (unsigned i = 0; i < ARRAY_SIZE(_mesa_glsl_supported_extensions); ++i) {
  659.       if (strcmp(name, _mesa_glsl_supported_extensions[i].name) == 0) {
  660.          return &_mesa_glsl_supported_extensions[i];
  661.       }
  662.    }
  663.    return NULL;
  664. }
  665.  
  666.  
  667. bool
  668. _mesa_glsl_process_extension(const char *name, YYLTYPE *name_locp,
  669.                              const char *behavior_string, YYLTYPE *behavior_locp,
  670.                              _mesa_glsl_parse_state *state)
  671. {
  672.    ext_behavior behavior;
  673.    if (strcmp(behavior_string, "warn") == 0) {
  674.       behavior = extension_warn;
  675.    } else if (strcmp(behavior_string, "require") == 0) {
  676.       behavior = extension_require;
  677.    } else if (strcmp(behavior_string, "enable") == 0) {
  678.       behavior = extension_enable;
  679.    } else if (strcmp(behavior_string, "disable") == 0) {
  680.       behavior = extension_disable;
  681.    } else {
  682.       _mesa_glsl_error(behavior_locp, state,
  683.                        "unknown extension behavior `%s'",
  684.                        behavior_string);
  685.       return false;
  686.    }
  687.  
  688.    if (strcmp(name, "all") == 0) {
  689.       if ((behavior == extension_enable) || (behavior == extension_require)) {
  690.          _mesa_glsl_error(name_locp, state, "cannot %s all extensions",
  691.                           (behavior == extension_enable)
  692.                           ? "enable" : "require");
  693.          return false;
  694.       } else {
  695.          for (unsigned i = 0;
  696.               i < ARRAY_SIZE(_mesa_glsl_supported_extensions); ++i) {
  697.             const _mesa_glsl_extension *extension
  698.                = &_mesa_glsl_supported_extensions[i];
  699.             if (extension->compatible_with_state(state)) {
  700.                _mesa_glsl_supported_extensions[i].set_flags(state, behavior);
  701.             }
  702.          }
  703.       }
  704.    } else {
  705.       const _mesa_glsl_extension *extension = find_extension(name);
  706.       if (extension && extension->compatible_with_state(state)) {
  707.          extension->set_flags(state, behavior);
  708.       } else {
  709.          static const char fmt[] = "extension `%s' unsupported in %s shader";
  710.  
  711.          if (behavior == extension_require) {
  712.             _mesa_glsl_error(name_locp, state, fmt,
  713.                              name, _mesa_shader_stage_to_string(state->stage));
  714.             return false;
  715.          } else {
  716.             _mesa_glsl_warning(name_locp, state, fmt,
  717.                                name, _mesa_shader_stage_to_string(state->stage));
  718.          }
  719.       }
  720.    }
  721.  
  722.    return true;
  723. }
  724.  
  725.  
  726. /**
  727.  * Recurses through <type> and <expr> if <expr> is an aggregate initializer
  728.  * and sets <expr>'s <constructor_type> field to <type>. Gives later functions
  729.  * (process_array_constructor, et al) sufficient information to do type
  730.  * checking.
  731.  *
  732.  * Operates on assignments involving an aggregate initializer. E.g.,
  733.  *
  734.  * vec4 pos = {1.0, -1.0, 0.0, 1.0};
  735.  *
  736.  * or more ridiculously,
  737.  *
  738.  * struct S {
  739.  *     vec4 v[2];
  740.  * };
  741.  *
  742.  * struct {
  743.  *     S a[2], b;
  744.  *     int c;
  745.  * } aggregate = {
  746.  *     {
  747.  *         {
  748.  *             {
  749.  *                 {1.0, 2.0, 3.0, 4.0}, // a[0].v[0]
  750.  *                 {5.0, 6.0, 7.0, 8.0}  // a[0].v[1]
  751.  *             } // a[0].v
  752.  *         }, // a[0]
  753.  *         {
  754.  *             {
  755.  *                 {1.0, 2.0, 3.0, 4.0}, // a[1].v[0]
  756.  *                 {5.0, 6.0, 7.0, 8.0}  // a[1].v[1]
  757.  *             } // a[1].v
  758.  *         } // a[1]
  759.  *     }, // a
  760.  *     {
  761.  *         {
  762.  *             {1.0, 2.0, 3.0, 4.0}, // b.v[0]
  763.  *             {5.0, 6.0, 7.0, 8.0}  // b.v[1]
  764.  *         } // b.v
  765.  *     }, // b
  766.  *     4 // c
  767.  * };
  768.  *
  769.  * This pass is necessary because the right-hand side of <type> e = { ... }
  770.  * doesn't contain sufficient information to determine if the types match.
  771.  */
  772. void
  773. _mesa_ast_set_aggregate_type(const glsl_type *type,
  774.                              ast_expression *expr)
  775. {
  776.    ast_aggregate_initializer *ai = (ast_aggregate_initializer *)expr;
  777.    ai->constructor_type = type;
  778.  
  779.    /* If the aggregate is an array, recursively set its elements' types. */
  780.    if (type->is_array()) {
  781.       /* Each array element has the type type->element_type().
  782.        *
  783.        * E.g., if <type> if struct S[2] we want to set each element's type to
  784.        * struct S.
  785.        */
  786.       for (exec_node *expr_node = ai->expressions.head;
  787.            !expr_node->is_tail_sentinel();
  788.            expr_node = expr_node->next) {
  789.          ast_expression *expr = exec_node_data(ast_expression, expr_node,
  790.                                                link);
  791.  
  792.          if (expr->oper == ast_aggregate)
  793.             _mesa_ast_set_aggregate_type(type->element_type(), expr);
  794.       }
  795.  
  796.    /* If the aggregate is a struct, recursively set its fields' types. */
  797.    } else if (type->is_record()) {
  798.       exec_node *expr_node = ai->expressions.head;
  799.  
  800.       /* Iterate through the struct's fields. */
  801.       for (unsigned i = 0; !expr_node->is_tail_sentinel() && i < type->length;
  802.            i++, expr_node = expr_node->next) {
  803.          ast_expression *expr = exec_node_data(ast_expression, expr_node,
  804.                                                link);
  805.  
  806.          if (expr->oper == ast_aggregate) {
  807.             _mesa_ast_set_aggregate_type(type->fields.structure[i].type, expr);
  808.          }
  809.       }
  810.    /* If the aggregate is a matrix, set its columns' types. */
  811.    } else if (type->is_matrix()) {
  812.       for (exec_node *expr_node = ai->expressions.head;
  813.            !expr_node->is_tail_sentinel();
  814.            expr_node = expr_node->next) {
  815.          ast_expression *expr = exec_node_data(ast_expression, expr_node,
  816.                                                link);
  817.  
  818.          if (expr->oper == ast_aggregate)
  819.             _mesa_ast_set_aggregate_type(type->column_type(), expr);
  820.       }
  821.    }
  822. }
  823.  
  824.  
  825. void
  826. _mesa_ast_type_qualifier_print(const struct ast_type_qualifier *q)
  827. {
  828.    if (q->flags.q.constant)
  829.       printf("const ");
  830.  
  831.    if (q->flags.q.invariant)
  832.       printf("invariant ");
  833.  
  834.    if (q->flags.q.attribute)
  835.       printf("attribute ");
  836.  
  837.    if (q->flags.q.varying)
  838.       printf("varying ");
  839.  
  840.    if (q->flags.q.in && q->flags.q.out)
  841.       printf("inout ");
  842.    else {
  843.       if (q->flags.q.in)
  844.          printf("in ");
  845.  
  846.       if (q->flags.q.out)
  847.          printf("out ");
  848.    }
  849.  
  850.    if (q->flags.q.centroid)
  851.       printf("centroid ");
  852.    if (q->flags.q.sample)
  853.       printf("sample ");
  854.    if (q->flags.q.uniform)
  855.       printf("uniform ");
  856.    if (q->flags.q.smooth)
  857.       printf("smooth ");
  858.    if (q->flags.q.flat)
  859.       printf("flat ");
  860.    if (q->flags.q.noperspective)
  861.       printf("noperspective ");
  862. }
  863.  
  864.  
  865. void
  866. ast_node::print(void) const
  867. {
  868.    printf("unhandled node ");
  869. }
  870.  
  871.  
  872. ast_node::ast_node(void)
  873. {
  874.    this->location.source = 0;
  875.    this->location.first_line = 0;
  876.    this->location.first_column = 0;
  877.    this->location.last_line = 0;
  878.    this->location.last_column = 0;
  879. }
  880.  
  881.  
  882. static void
  883. ast_opt_array_dimensions_print(const ast_array_specifier *array_specifier)
  884. {
  885.    if (array_specifier)
  886.       array_specifier->print();
  887. }
  888.  
  889.  
  890. void
  891. ast_compound_statement::print(void) const
  892. {
  893.    printf("{\n");
  894.    
  895.    foreach_list_typed(ast_node, ast, link, &this->statements) {
  896.       ast->print();
  897.    }
  898.  
  899.    printf("}\n");
  900. }
  901.  
  902.  
  903. ast_compound_statement::ast_compound_statement(int new_scope,
  904.                                                ast_node *statements)
  905. {
  906.    this->new_scope = new_scope;
  907.  
  908.    if (statements != NULL) {
  909.       this->statements.push_degenerate_list_at_head(&statements->link);
  910.    }
  911. }
  912.  
  913.  
  914. void
  915. ast_expression::print(void) const
  916. {
  917.    switch (oper) {
  918.    case ast_assign:
  919.    case ast_mul_assign:
  920.    case ast_div_assign:
  921.    case ast_mod_assign:
  922.    case ast_add_assign:
  923.    case ast_sub_assign:
  924.    case ast_ls_assign:
  925.    case ast_rs_assign:
  926.    case ast_and_assign:
  927.    case ast_xor_assign:
  928.    case ast_or_assign:
  929.       subexpressions[0]->print();
  930.       printf("%s ", operator_string(oper));
  931.       subexpressions[1]->print();
  932.       break;
  933.  
  934.    case ast_field_selection:
  935.       subexpressions[0]->print();
  936.       printf(". %s ", primary_expression.identifier);
  937.       break;
  938.  
  939.    case ast_plus:
  940.    case ast_neg:
  941.    case ast_bit_not:
  942.    case ast_logic_not:
  943.    case ast_pre_inc:
  944.    case ast_pre_dec:
  945.       printf("%s ", operator_string(oper));
  946.       subexpressions[0]->print();
  947.       break;
  948.  
  949.    case ast_post_inc:
  950.    case ast_post_dec:
  951.       subexpressions[0]->print();
  952.       printf("%s ", operator_string(oper));
  953.       break;
  954.  
  955.    case ast_conditional:
  956.       subexpressions[0]->print();
  957.       printf("? ");
  958.       subexpressions[1]->print();
  959.       printf(": ");
  960.       subexpressions[2]->print();
  961.       break;
  962.  
  963.    case ast_array_index:
  964.       subexpressions[0]->print();
  965.       printf("[ ");
  966.       subexpressions[1]->print();
  967.       printf("] ");
  968.       break;
  969.  
  970.    case ast_function_call: {
  971.       subexpressions[0]->print();
  972.       printf("( ");
  973.  
  974.       foreach_list_typed (ast_node, ast, link, &this->expressions) {
  975.          if (&ast->link != this->expressions.get_head())
  976.             printf(", ");
  977.  
  978.          ast->print();
  979.       }
  980.  
  981.       printf(") ");
  982.       break;
  983.    }
  984.  
  985.    case ast_identifier:
  986.       printf("%s ", primary_expression.identifier);
  987.       break;
  988.  
  989.    case ast_int_constant:
  990.       printf("%d ", primary_expression.int_constant);
  991.       break;
  992.  
  993.    case ast_uint_constant:
  994.       printf("%u ", primary_expression.uint_constant);
  995.       break;
  996.  
  997.    case ast_float_constant:
  998.       printf("%f ", primary_expression.float_constant);
  999.       break;
  1000.  
  1001.    case ast_double_constant:
  1002.       printf("%f ", primary_expression.double_constant);
  1003.       break;
  1004.  
  1005.    case ast_bool_constant:
  1006.       printf("%s ",
  1007.              primary_expression.bool_constant
  1008.              ? "true" : "false");
  1009.       break;
  1010.  
  1011.    case ast_sequence: {
  1012.       printf("( ");
  1013.       foreach_list_typed (ast_node, ast, link, & this->expressions) {
  1014.          if (&ast->link != this->expressions.get_head())
  1015.             printf(", ");
  1016.  
  1017.          ast->print();
  1018.       }
  1019.       printf(") ");
  1020.       break;
  1021.    }
  1022.  
  1023.    case ast_aggregate: {
  1024.       printf("{ ");
  1025.       foreach_list_typed (ast_node, ast, link, & this->expressions) {
  1026.          if (&ast->link != this->expressions.get_head())
  1027.             printf(", ");
  1028.  
  1029.          ast->print();
  1030.       }
  1031.       printf("} ");
  1032.       break;
  1033.    }
  1034.  
  1035.    default:
  1036.       assert(0);
  1037.       break;
  1038.    }
  1039. }
  1040.  
  1041. ast_expression::ast_expression(int oper,
  1042.                                ast_expression *ex0,
  1043.                                ast_expression *ex1,
  1044.                                ast_expression *ex2) :
  1045.    primary_expression()
  1046. {
  1047.    this->oper = ast_operators(oper);
  1048.    this->subexpressions[0] = ex0;
  1049.    this->subexpressions[1] = ex1;
  1050.    this->subexpressions[2] = ex2;
  1051.    this->non_lvalue_description = NULL;
  1052. }
  1053.  
  1054.  
  1055. void
  1056. ast_expression_statement::print(void) const
  1057. {
  1058.    if (expression)
  1059.       expression->print();
  1060.  
  1061.    printf("; ");
  1062. }
  1063.  
  1064.  
  1065. ast_expression_statement::ast_expression_statement(ast_expression *ex) :
  1066.    expression(ex)
  1067. {
  1068.    /* empty */
  1069. }
  1070.  
  1071.  
  1072. void
  1073. ast_function::print(void) const
  1074. {
  1075.    return_type->print();
  1076.    printf(" %s (", identifier);
  1077.  
  1078.    foreach_list_typed(ast_node, ast, link, & this->parameters) {
  1079.       ast->print();
  1080.    }
  1081.  
  1082.    printf(")");
  1083. }
  1084.  
  1085.  
  1086. ast_function::ast_function(void)
  1087.    : return_type(NULL), identifier(NULL), is_definition(false),
  1088.      signature(NULL)
  1089. {
  1090.    /* empty */
  1091. }
  1092.  
  1093.  
  1094. void
  1095. ast_fully_specified_type::print(void) const
  1096. {
  1097.    _mesa_ast_type_qualifier_print(& qualifier);
  1098.    specifier->print();
  1099. }
  1100.  
  1101.  
  1102. void
  1103. ast_parameter_declarator::print(void) const
  1104. {
  1105.    type->print();
  1106.    if (identifier)
  1107.       printf("%s ", identifier);
  1108.    ast_opt_array_dimensions_print(array_specifier);
  1109. }
  1110.  
  1111.  
  1112. void
  1113. ast_function_definition::print(void) const
  1114. {
  1115.    prototype->print();
  1116.    body->print();
  1117. }
  1118.  
  1119.  
  1120. void
  1121. ast_declaration::print(void) const
  1122. {
  1123.    printf("%s ", identifier);
  1124.    ast_opt_array_dimensions_print(array_specifier);
  1125.  
  1126.    if (initializer) {
  1127.       printf("= ");
  1128.       initializer->print();
  1129.    }
  1130. }
  1131.  
  1132.  
  1133. ast_declaration::ast_declaration(const char *identifier,
  1134.                                  ast_array_specifier *array_specifier,
  1135.                                  ast_expression *initializer)
  1136. {
  1137.    this->identifier = identifier;
  1138.    this->array_specifier = array_specifier;
  1139.    this->initializer = initializer;
  1140. }
  1141.  
  1142.  
  1143. void
  1144. ast_declarator_list::print(void) const
  1145. {
  1146.    assert(type || invariant);
  1147.  
  1148.    if (type)
  1149.       type->print();
  1150.    else if (invariant)
  1151.       printf("invariant ");
  1152.    else
  1153.       printf("precise ");
  1154.  
  1155.    foreach_list_typed (ast_node, ast, link, & this->declarations) {
  1156.       if (&ast->link != this->declarations.get_head())
  1157.          printf(", ");
  1158.  
  1159.       ast->print();
  1160.    }
  1161.  
  1162.    printf("; ");
  1163. }
  1164.  
  1165.  
  1166. ast_declarator_list::ast_declarator_list(ast_fully_specified_type *type)
  1167. {
  1168.    this->type = type;
  1169.    this->invariant = false;
  1170.    this->precise = false;
  1171. }
  1172.  
  1173. void
  1174. ast_jump_statement::print(void) const
  1175. {
  1176.    switch (mode) {
  1177.    case ast_continue:
  1178.       printf("continue; ");
  1179.       break;
  1180.    case ast_break:
  1181.       printf("break; ");
  1182.       break;
  1183.    case ast_return:
  1184.       printf("return ");
  1185.       if (opt_return_value)
  1186.          opt_return_value->print();
  1187.  
  1188.       printf("; ");
  1189.       break;
  1190.    case ast_discard:
  1191.       printf("discard; ");
  1192.       break;
  1193.    }
  1194. }
  1195.  
  1196.  
  1197. ast_jump_statement::ast_jump_statement(int mode, ast_expression *return_value)
  1198.    : opt_return_value(NULL)
  1199. {
  1200.    this->mode = ast_jump_modes(mode);
  1201.  
  1202.    if (mode == ast_return)
  1203.       opt_return_value = return_value;
  1204. }
  1205.  
  1206.  
  1207. void
  1208. ast_selection_statement::print(void) const
  1209. {
  1210.    printf("if ( ");
  1211.    condition->print();
  1212.    printf(") ");
  1213.  
  1214.    then_statement->print();
  1215.  
  1216.    if (else_statement) {
  1217.       printf("else ");
  1218.       else_statement->print();
  1219.    }
  1220.    
  1221. }
  1222.  
  1223.  
  1224. ast_selection_statement::ast_selection_statement(ast_expression *condition,
  1225.                                                  ast_node *then_statement,
  1226.                                                  ast_node *else_statement)
  1227. {
  1228.    this->condition = condition;
  1229.    this->then_statement = then_statement;
  1230.    this->else_statement = else_statement;
  1231. }
  1232.  
  1233.  
  1234. void
  1235. ast_switch_statement::print(void) const
  1236. {
  1237.    printf("switch ( ");
  1238.    test_expression->print();
  1239.    printf(") ");
  1240.  
  1241.    body->print();
  1242. }
  1243.  
  1244.  
  1245. ast_switch_statement::ast_switch_statement(ast_expression *test_expression,
  1246.                                            ast_node *body)
  1247. {
  1248.    this->test_expression = test_expression;
  1249.    this->body = body;
  1250. }
  1251.  
  1252.  
  1253. void
  1254. ast_switch_body::print(void) const
  1255. {
  1256.    printf("{\n");
  1257.    if (stmts != NULL) {
  1258.       stmts->print();
  1259.    }
  1260.    printf("}\n");
  1261. }
  1262.  
  1263.  
  1264. ast_switch_body::ast_switch_body(ast_case_statement_list *stmts)
  1265. {
  1266.    this->stmts = stmts;
  1267. }
  1268.  
  1269.  
  1270. void ast_case_label::print(void) const
  1271. {
  1272.    if (test_value != NULL) {
  1273.       printf("case ");
  1274.       test_value->print();
  1275.       printf(": ");
  1276.    } else {
  1277.       printf("default: ");
  1278.    }
  1279. }
  1280.  
  1281.  
  1282. ast_case_label::ast_case_label(ast_expression *test_value)
  1283. {
  1284.    this->test_value = test_value;
  1285. }
  1286.  
  1287.  
  1288. void ast_case_label_list::print(void) const
  1289. {
  1290.    foreach_list_typed(ast_node, ast, link, & this->labels) {
  1291.       ast->print();
  1292.    }
  1293.    printf("\n");
  1294. }
  1295.  
  1296.  
  1297. ast_case_label_list::ast_case_label_list(void)
  1298. {
  1299. }
  1300.  
  1301.  
  1302. void ast_case_statement::print(void) const
  1303. {
  1304.    labels->print();
  1305.    foreach_list_typed(ast_node, ast, link, & this->stmts) {
  1306.       ast->print();
  1307.       printf("\n");
  1308.    }
  1309. }
  1310.  
  1311.  
  1312. ast_case_statement::ast_case_statement(ast_case_label_list *labels)
  1313. {
  1314.    this->labels = labels;
  1315. }
  1316.  
  1317.  
  1318. void ast_case_statement_list::print(void) const
  1319. {
  1320.    foreach_list_typed(ast_node, ast, link, & this->cases) {
  1321.       ast->print();
  1322.    }
  1323. }
  1324.  
  1325.  
  1326. ast_case_statement_list::ast_case_statement_list(void)
  1327. {
  1328. }
  1329.  
  1330.  
  1331. void
  1332. ast_iteration_statement::print(void) const
  1333. {
  1334.    switch (mode) {
  1335.    case ast_for:
  1336.       printf("for( ");
  1337.       if (init_statement)
  1338.          init_statement->print();
  1339.       printf("; ");
  1340.  
  1341.       if (condition)
  1342.          condition->print();
  1343.       printf("; ");
  1344.  
  1345.       if (rest_expression)
  1346.          rest_expression->print();
  1347.       printf(") ");
  1348.  
  1349.       body->print();
  1350.       break;
  1351.  
  1352.    case ast_while:
  1353.       printf("while ( ");
  1354.       if (condition)
  1355.          condition->print();
  1356.       printf(") ");
  1357.       body->print();
  1358.       break;
  1359.  
  1360.    case ast_do_while:
  1361.       printf("do ");
  1362.       body->print();
  1363.       printf("while ( ");
  1364.       if (condition)
  1365.          condition->print();
  1366.       printf("); ");
  1367.       break;
  1368.    }
  1369. }
  1370.  
  1371.  
  1372. ast_iteration_statement::ast_iteration_statement(int mode,
  1373.                                                  ast_node *init,
  1374.                                                  ast_node *condition,
  1375.                                                  ast_expression *rest_expression,
  1376.                                                  ast_node *body)
  1377. {
  1378.    this->mode = ast_iteration_modes(mode);
  1379.    this->init_statement = init;
  1380.    this->condition = condition;
  1381.    this->rest_expression = rest_expression;
  1382.    this->body = body;
  1383. }
  1384.  
  1385.  
  1386. void
  1387. ast_struct_specifier::print(void) const
  1388. {
  1389.    printf("struct %s { ", name);
  1390.    foreach_list_typed(ast_node, ast, link, &this->declarations) {
  1391.       ast->print();
  1392.    }
  1393.    printf("} ");
  1394. }
  1395.  
  1396.  
  1397. ast_struct_specifier::ast_struct_specifier(const char *identifier,
  1398.                                            ast_declarator_list *declarator_list)
  1399. {
  1400.    if (identifier == NULL) {
  1401.       static mtx_t mutex = _MTX_INITIALIZER_NP;
  1402.       static unsigned anon_count = 1;
  1403.       unsigned count;
  1404.  
  1405.       mtx_lock(&mutex);
  1406.       count = anon_count++;
  1407.       mtx_unlock(&mutex);
  1408.  
  1409.       identifier = ralloc_asprintf(this, "#anon_struct_%04x", count);
  1410.    }
  1411.    name = identifier;
  1412.    this->declarations.push_degenerate_list_at_head(&declarator_list->link);
  1413.    is_declaration = true;
  1414. }
  1415.  
  1416. static void
  1417. set_shader_inout_layout(struct gl_shader *shader,
  1418.                      struct _mesa_glsl_parse_state *state)
  1419. {
  1420.    if (shader->Stage != MESA_SHADER_GEOMETRY) {
  1421.       /* Should have been prevented by the parser. */
  1422.       assert(!state->in_qualifier->flags.i);
  1423.       assert(!state->out_qualifier->flags.i);
  1424.    }
  1425.  
  1426.    if (shader->Stage != MESA_SHADER_COMPUTE) {
  1427.       /* Should have been prevented by the parser. */
  1428.       assert(!state->cs_input_local_size_specified);
  1429.    }
  1430.  
  1431.    if (shader->Stage != MESA_SHADER_FRAGMENT) {
  1432.       /* Should have been prevented by the parser. */
  1433.       assert(!state->fs_uses_gl_fragcoord);
  1434.       assert(!state->fs_redeclares_gl_fragcoord);
  1435.       assert(!state->fs_pixel_center_integer);
  1436.       assert(!state->fs_origin_upper_left);
  1437.       assert(!state->fs_early_fragment_tests);
  1438.    }
  1439.  
  1440.    switch (shader->Stage) {
  1441.    case MESA_SHADER_GEOMETRY:
  1442.       shader->Geom.VerticesOut = 0;
  1443.       if (state->out_qualifier->flags.q.max_vertices)
  1444.          shader->Geom.VerticesOut = state->out_qualifier->max_vertices;
  1445.  
  1446.       if (state->gs_input_prim_type_specified) {
  1447.          shader->Geom.InputType = state->in_qualifier->prim_type;
  1448.       } else {
  1449.          shader->Geom.InputType = PRIM_UNKNOWN;
  1450.       }
  1451.  
  1452.       if (state->out_qualifier->flags.q.prim_type) {
  1453.          shader->Geom.OutputType = state->out_qualifier->prim_type;
  1454.       } else {
  1455.          shader->Geom.OutputType = PRIM_UNKNOWN;
  1456.       }
  1457.  
  1458.       shader->Geom.Invocations = 0;
  1459.       if (state->in_qualifier->flags.q.invocations)
  1460.          shader->Geom.Invocations = state->in_qualifier->invocations;
  1461.       break;
  1462.  
  1463.    case MESA_SHADER_COMPUTE:
  1464.       if (state->cs_input_local_size_specified) {
  1465.          for (int i = 0; i < 3; i++)
  1466.             shader->Comp.LocalSize[i] = state->cs_input_local_size[i];
  1467.       } else {
  1468.          for (int i = 0; i < 3; i++)
  1469.             shader->Comp.LocalSize[i] = 0;
  1470.       }
  1471.       break;
  1472.  
  1473.    case MESA_SHADER_FRAGMENT:
  1474.       shader->redeclares_gl_fragcoord = state->fs_redeclares_gl_fragcoord;
  1475.       shader->uses_gl_fragcoord = state->fs_uses_gl_fragcoord;
  1476.       shader->pixel_center_integer = state->fs_pixel_center_integer;
  1477.       shader->origin_upper_left = state->fs_origin_upper_left;
  1478.       shader->ARB_fragment_coord_conventions_enable =
  1479.          state->ARB_fragment_coord_conventions_enable;
  1480.       shader->EarlyFragmentTests = state->fs_early_fragment_tests;
  1481.       break;
  1482.  
  1483.    default:
  1484.       /* Nothing to do. */
  1485.       break;
  1486.    }
  1487. }
  1488.  
  1489. extern "C" {
  1490.  
  1491. void
  1492. _mesa_glsl_compile_shader(struct gl_context *ctx, struct gl_shader *shader,
  1493.                           bool dump_ast, bool dump_hir)
  1494. {
  1495.    struct _mesa_glsl_parse_state *state =
  1496.       new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader);
  1497.    const char *source = shader->Source;
  1498.  
  1499.    if (ctx->Const.GenerateTemporaryNames)
  1500.       (void) p_atomic_cmpxchg(&ir_variable::temporaries_allocate_names,
  1501.                               false, true);
  1502.  
  1503.    state->error = glcpp_preprocess(state, &source, &state->info_log,
  1504.                              &ctx->Extensions, ctx);
  1505.  
  1506.    if (!state->error) {
  1507.      _mesa_glsl_lexer_ctor(state, source);
  1508.      _mesa_glsl_parse(state);
  1509.      _mesa_glsl_lexer_dtor(state);
  1510.    }
  1511.  
  1512.    if (dump_ast) {
  1513.       foreach_list_typed(ast_node, ast, link, &state->translation_unit) {
  1514.          ast->print();
  1515.       }
  1516.       printf("\n\n");
  1517.    }
  1518.  
  1519.    ralloc_free(shader->ir);
  1520.    shader->ir = new(shader) exec_list;
  1521.    if (!state->error && !state->translation_unit.is_empty())
  1522.       _mesa_ast_to_hir(shader->ir, state);
  1523.  
  1524.    if (!state->error) {
  1525.       validate_ir_tree(shader->ir);
  1526.  
  1527.       /* Print out the unoptimized IR. */
  1528.       if (dump_hir) {
  1529.          _mesa_print_ir(stdout, shader->ir, state);
  1530.       }
  1531.    }
  1532.  
  1533.  
  1534.    if (!state->error && !shader->ir->is_empty()) {
  1535.       struct gl_shader_compiler_options *options =
  1536.          &ctx->Const.ShaderCompilerOptions[shader->Stage];
  1537.  
  1538.       /* Do some optimization at compile time to reduce shader IR size
  1539.        * and reduce later work if the same shader is linked multiple times
  1540.        */
  1541.       while (do_common_optimization(shader->ir, false, false, options,
  1542.                                     ctx->Const.NativeIntegers))
  1543.          ;
  1544.  
  1545.       validate_ir_tree(shader->ir);
  1546.  
  1547.       enum ir_variable_mode other;
  1548.       switch (shader->Stage) {
  1549.       case MESA_SHADER_VERTEX:
  1550.          other = ir_var_shader_in;
  1551.          break;
  1552.       case MESA_SHADER_FRAGMENT:
  1553.          other = ir_var_shader_out;
  1554.          break;
  1555.       default:
  1556.          /* Something invalid to ensure optimize_dead_builtin_uniforms
  1557.           * doesn't remove anything other than uniforms or constants.
  1558.           */
  1559.          other = ir_var_mode_count;
  1560.          break;
  1561.       }
  1562.  
  1563.       optimize_dead_builtin_variables(shader->ir, other);
  1564.  
  1565.       validate_ir_tree(shader->ir);
  1566.    }
  1567.  
  1568.    if (shader->InfoLog)
  1569.       ralloc_free(shader->InfoLog);
  1570.  
  1571.    shader->symbols = new(shader->ir) glsl_symbol_table;
  1572.    shader->CompileStatus = !state->error;
  1573.    shader->InfoLog = state->info_log;
  1574.    shader->Version = state->language_version;
  1575.    shader->IsES = state->es_shader;
  1576.    shader->uses_builtin_functions = state->uses_builtin_functions;
  1577.  
  1578.    if (!state->error)
  1579.       set_shader_inout_layout(shader, state);
  1580.  
  1581.    /* Retain any live IR, but trash the rest. */
  1582.    reparent_ir(shader->ir, shader->ir);
  1583.  
  1584.    /* Destroy the symbol table.  Create a new symbol table that contains only
  1585.     * the variables and functions that still exist in the IR.  The symbol
  1586.     * table will be used later during linking.
  1587.     *
  1588.     * There must NOT be any freed objects still referenced by the symbol
  1589.     * table.  That could cause the linker to dereference freed memory.
  1590.     *
  1591.     * We don't have to worry about types or interface-types here because those
  1592.     * are fly-weights that are looked up by glsl_type.
  1593.     */
  1594.    foreach_in_list (ir_instruction, ir, shader->ir) {
  1595.       switch (ir->ir_type) {
  1596.       case ir_type_function:
  1597.          shader->symbols->add_function((ir_function *) ir);
  1598.          break;
  1599.       case ir_type_variable: {
  1600.          ir_variable *const var = (ir_variable *) ir;
  1601.  
  1602.          if (var->data.mode != ir_var_temporary)
  1603.             shader->symbols->add_variable(var);
  1604.          break;
  1605.       }
  1606.       default:
  1607.          break;
  1608.       }
  1609.    }
  1610.  
  1611.    delete state->symbols;
  1612.    ralloc_free(state);
  1613. }
  1614.  
  1615. } /* extern "C" */
  1616. /**
  1617.  * Do the set of common optimizations passes
  1618.  *
  1619.  * \param ir                          List of instructions to be optimized
  1620.  * \param linked                      Is the shader linked?  This enables
  1621.  *                                    optimizations passes that remove code at
  1622.  *                                    global scope and could cause linking to
  1623.  *                                    fail.
  1624.  * \param uniform_locations_assigned  Have locations already been assigned for
  1625.  *                                    uniforms?  This prevents the declarations
  1626.  *                                    of unused uniforms from being removed.
  1627.  *                                    The setting of this flag only matters if
  1628.  *                                    \c linked is \c true.
  1629.  * \param max_unroll_iterations       Maximum number of loop iterations to be
  1630.  *                                    unrolled.  Setting to 0 disables loop
  1631.  *                                    unrolling.
  1632.  * \param options                     The driver's preferred shader options.
  1633.  */
  1634. bool
  1635. do_common_optimization(exec_list *ir, bool linked,
  1636.                        bool uniform_locations_assigned,
  1637.                        const struct gl_shader_compiler_options *options,
  1638.                        bool native_integers)
  1639. {
  1640.    GLboolean progress = GL_FALSE;
  1641.  
  1642.    progress = lower_instructions(ir, SUB_TO_ADD_NEG) || progress;
  1643.  
  1644.    if (linked) {
  1645.       progress = do_function_inlining(ir) || progress;
  1646.       progress = do_dead_functions(ir) || progress;
  1647.       progress = do_structure_splitting(ir) || progress;
  1648.    }
  1649.    progress = do_if_simplification(ir) || progress;
  1650.    progress = opt_flatten_nested_if_blocks(ir) || progress;
  1651.    progress = opt_conditional_discard(ir) || progress;
  1652.    progress = do_copy_propagation(ir) || progress;
  1653.    progress = do_copy_propagation_elements(ir) || progress;
  1654.  
  1655.    if (options->OptimizeForAOS && !linked)
  1656.       progress = opt_flip_matrices(ir) || progress;
  1657.  
  1658.    if (linked && options->OptimizeForAOS) {
  1659.       progress = do_vectorize(ir) || progress;
  1660.    }
  1661.  
  1662.    if (linked)
  1663.       progress = do_dead_code(ir, uniform_locations_assigned) || progress;
  1664.    else
  1665.       progress = do_dead_code_unlinked(ir) || progress;
  1666.    progress = do_dead_code_local(ir) || progress;
  1667.    progress = do_tree_grafting(ir) || progress;
  1668.    progress = do_constant_propagation(ir) || progress;
  1669.    if (linked)
  1670.       progress = do_constant_variable(ir) || progress;
  1671.    else
  1672.       progress = do_constant_variable_unlinked(ir) || progress;
  1673.    progress = do_constant_folding(ir) || progress;
  1674.    progress = do_minmax_prune(ir) || progress;
  1675.    progress = do_cse(ir) || progress;
  1676.    progress = do_rebalance_tree(ir) || progress;
  1677.    progress = do_algebraic(ir, native_integers, options) || progress;
  1678.    progress = do_lower_jumps(ir) || progress;
  1679.    progress = do_vec_index_to_swizzle(ir) || progress;
  1680.    progress = lower_vector_insert(ir, false) || progress;
  1681.    progress = do_swizzle_swizzle(ir) || progress;
  1682.    progress = do_noop_swizzle(ir) || progress;
  1683.  
  1684.    progress = optimize_split_arrays(ir, linked) || progress;
  1685.    progress = optimize_redundant_jumps(ir) || progress;
  1686.  
  1687.    loop_state *ls = analyze_loop_variables(ir);
  1688.    if (ls->loop_found) {
  1689.       progress = set_loop_controls(ir, ls) || progress;
  1690.       progress = unroll_loops(ir, ls, options) || progress;
  1691.    }
  1692.    delete ls;
  1693.  
  1694.    return progress;
  1695. }
  1696.  
  1697. extern "C" {
  1698.  
  1699. /**
  1700.  * To be called at GL teardown time, this frees compiler datastructures.
  1701.  *
  1702.  * After calling this, any previously compiled shaders and shader
  1703.  * programs would be invalid.  So this should happen at approximately
  1704.  * program exit.
  1705.  */
  1706. void
  1707. _mesa_destroy_shader_compiler(void)
  1708. {
  1709.    _mesa_destroy_shader_compiler_caches();
  1710.  
  1711.    _mesa_glsl_release_types();
  1712. }
  1713.  
  1714. /**
  1715.  * Releases compiler caches to trade off performance for memory.
  1716.  *
  1717.  * Intended to be used with glReleaseShaderCompiler().
  1718.  */
  1719. void
  1720. _mesa_destroy_shader_compiler_caches(void)
  1721. {
  1722.    _mesa_glsl_release_builtin_functions();
  1723. }
  1724.  
  1725. }
  1726.