Home | History | Annotate | Download | only in glsl
      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 <getopt.h>
     24 
     25 /** @file standalone.cpp
     26  *
     27  * Standalone compiler helper lib.  Used by standalone glsl_compiler and
     28  * also available to drivers to implement their own standalone compiler
     29  * with driver backend.
     30  */
     31 
     32 #include "ast.h"
     33 #include "glsl_parser_extras.h"
     34 #include "ir_optimization.h"
     35 #include "program.h"
     36 #include "loop_analysis.h"
     37 #include "standalone_scaffolding.h"
     38 #include "standalone.h"
     39 #include "string_to_uint_map.h"
     40 #include "util/set.h"
     41 #include "linker.h"
     42 #include "glsl_parser_extras.h"
     43 #include "ir_builder_print_visitor.h"
     44 #include "builtin_functions.h"
     45 #include "opt_add_neg_to_sub.h"
     46 
     47 class dead_variable_visitor : public ir_hierarchical_visitor {
     48 public:
     49    dead_variable_visitor()
     50    {
     51       variables = _mesa_set_create(NULL,
     52                                    _mesa_hash_pointer,
     53                                    _mesa_key_pointer_equal);
     54    }
     55 
     56    virtual ~dead_variable_visitor()
     57    {
     58       _mesa_set_destroy(variables, NULL);
     59    }
     60 
     61    virtual ir_visitor_status visit(ir_variable *ir)
     62    {
     63       /* If the variable is auto or temp, add it to the set of variables that
     64        * are candidates for removal.
     65        */
     66       if (ir->data.mode != ir_var_auto && ir->data.mode != ir_var_temporary)
     67          return visit_continue;
     68 
     69       _mesa_set_add(variables, ir);
     70 
     71       return visit_continue;
     72    }
     73 
     74    virtual ir_visitor_status visit(ir_dereference_variable *ir)
     75    {
     76       struct set_entry *entry = _mesa_set_search(variables, ir->var);
     77 
     78       /* If a variable is dereferenced at all, remove it from the set of
     79        * variables that are candidates for removal.
     80        */
     81       if (entry != NULL)
     82          _mesa_set_remove(variables, entry);
     83 
     84       return visit_continue;
     85    }
     86 
     87    void remove_dead_variables()
     88    {
     89       struct set_entry *entry;
     90 
     91       set_foreach(variables, entry) {
     92          ir_variable *ir = (ir_variable *) entry->key;
     93 
     94          assert(ir->ir_type == ir_type_variable);
     95          ir->remove();
     96       }
     97    }
     98 
     99 private:
    100    set *variables;
    101 };
    102 
    103 static void
    104 init_gl_program(struct gl_program *prog, bool is_arb_asm)
    105 {
    106    prog->RefCount = 1;
    107    prog->Format = GL_PROGRAM_FORMAT_ASCII_ARB;
    108    prog->is_arb_asm = is_arb_asm;
    109 }
    110 
    111 static struct gl_program *
    112 new_program(UNUSED struct gl_context *ctx, GLenum target,
    113             UNUSED GLuint id, bool is_arb_asm)
    114 {
    115    switch (target) {
    116    case GL_VERTEX_PROGRAM_ARB: /* == GL_VERTEX_PROGRAM_NV */
    117    case GL_GEOMETRY_PROGRAM_NV:
    118    case GL_TESS_CONTROL_PROGRAM_NV:
    119    case GL_TESS_EVALUATION_PROGRAM_NV:
    120    case GL_FRAGMENT_PROGRAM_ARB:
    121    case GL_COMPUTE_PROGRAM_NV: {
    122       struct gl_program *prog = rzalloc(NULL, struct gl_program);
    123       init_gl_program(prog, is_arb_asm);
    124       return prog;
    125    }
    126    default:
    127       printf("bad target in new_program\n");
    128       return NULL;
    129    }
    130 }
    131 
    132 static const struct standalone_options *options;
    133 
    134 static void
    135 initialize_context(struct gl_context *ctx, gl_api api)
    136 {
    137    initialize_context_to_defaults(ctx, api);
    138 
    139    /* The standalone compiler needs to claim support for almost
    140     * everything in order to compile the built-in functions.
    141     */
    142    ctx->Const.GLSLVersion = options->glsl_version;
    143    ctx->Extensions.ARB_ES3_compatibility = true;
    144    ctx->Const.MaxComputeWorkGroupCount[0] = 65535;
    145    ctx->Const.MaxComputeWorkGroupCount[1] = 65535;
    146    ctx->Const.MaxComputeWorkGroupCount[2] = 65535;
    147    ctx->Const.MaxComputeWorkGroupSize[0] = 1024;
    148    ctx->Const.MaxComputeWorkGroupSize[1] = 1024;
    149    ctx->Const.MaxComputeWorkGroupSize[2] = 64;
    150    ctx->Const.MaxComputeWorkGroupInvocations = 1024;
    151    ctx->Const.MaxComputeSharedMemorySize = 32768;
    152    ctx->Const.MaxComputeVariableGroupSize[0] = 512;
    153    ctx->Const.MaxComputeVariableGroupSize[1] = 512;
    154    ctx->Const.MaxComputeVariableGroupSize[2] = 64;
    155    ctx->Const.MaxComputeVariableGroupInvocations = 512;
    156    ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = 16;
    157    ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformComponents = 1024;
    158    ctx->Const.Program[MESA_SHADER_COMPUTE].MaxCombinedUniformComponents = 1024;
    159    ctx->Const.Program[MESA_SHADER_COMPUTE].MaxInputComponents = 0; /* not used */
    160    ctx->Const.Program[MESA_SHADER_COMPUTE].MaxOutputComponents = 0; /* not used */
    161    ctx->Const.Program[MESA_SHADER_COMPUTE].MaxAtomicBuffers = 8;
    162    ctx->Const.Program[MESA_SHADER_COMPUTE].MaxAtomicCounters = 8;
    163    ctx->Const.Program[MESA_SHADER_COMPUTE].MaxImageUniforms = 8;
    164    ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformBlocks = 12;
    165 
    166    switch (ctx->Const.GLSLVersion) {
    167    case 100:
    168       ctx->Const.MaxClipPlanes = 0;
    169       ctx->Const.MaxCombinedTextureImageUnits = 8;
    170       ctx->Const.MaxDrawBuffers = 2;
    171       ctx->Const.MinProgramTexelOffset = 0;
    172       ctx->Const.MaxProgramTexelOffset = 0;
    173       ctx->Const.MaxLights = 0;
    174       ctx->Const.MaxTextureCoordUnits = 0;
    175       ctx->Const.MaxTextureUnits = 8;
    176 
    177       ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 8;
    178       ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 0;
    179       ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 128 * 4;
    180       ctx->Const.Program[MESA_SHADER_VERTEX].MaxCombinedUniformComponents = 128 * 4;
    181       ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */
    182       ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 32;
    183 
    184       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits =
    185          ctx->Const.MaxCombinedTextureImageUnits;
    186       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 16 * 4;
    187       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxCombinedUniformComponents = 16 * 4;
    188       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents =
    189          ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents;
    190       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */
    191 
    192       ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4;
    193       break;
    194    case 110:
    195    case 120:
    196       ctx->Const.MaxClipPlanes = 6;
    197       ctx->Const.MaxCombinedTextureImageUnits = 2;
    198       ctx->Const.MaxDrawBuffers = 1;
    199       ctx->Const.MinProgramTexelOffset = 0;
    200       ctx->Const.MaxProgramTexelOffset = 0;
    201       ctx->Const.MaxLights = 8;
    202       ctx->Const.MaxTextureCoordUnits = 2;
    203       ctx->Const.MaxTextureUnits = 2;
    204 
    205       ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16;
    206       ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 0;
    207       ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 512;
    208       ctx->Const.Program[MESA_SHADER_VERTEX].MaxCombinedUniformComponents = 512;
    209       ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */
    210       ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 32;
    211 
    212       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits =
    213          ctx->Const.MaxCombinedTextureImageUnits;
    214       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 64;
    215       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxCombinedUniformComponents = 64;
    216       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents =
    217          ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents;
    218       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */
    219 
    220       ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4;
    221       break;
    222    case 130:
    223    case 140:
    224       ctx->Const.MaxClipPlanes = 8;
    225       ctx->Const.MaxCombinedTextureImageUnits = 16;
    226       ctx->Const.MaxDrawBuffers = 8;
    227       ctx->Const.MinProgramTexelOffset = -8;
    228       ctx->Const.MaxProgramTexelOffset = 7;
    229       ctx->Const.MaxLights = 8;
    230       ctx->Const.MaxTextureCoordUnits = 8;
    231       ctx->Const.MaxTextureUnits = 2;
    232       ctx->Const.MaxUniformBufferBindings = 84;
    233       ctx->Const.MaxVertexStreams = 4;
    234       ctx->Const.MaxTransformFeedbackBuffers = 4;
    235 
    236       ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16;
    237       ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 16;
    238       ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 1024;
    239       ctx->Const.Program[MESA_SHADER_VERTEX].MaxCombinedUniformComponents = 1024;
    240       ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */
    241       ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 64;
    242 
    243       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = 16;
    244       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 1024;
    245       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxCombinedUniformComponents = 1024;
    246       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents =
    247          ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents;
    248       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */
    249 
    250       ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4;
    251       break;
    252    case 150:
    253    case 330:
    254    case 400:
    255    case 410:
    256    case 420:
    257    case 430:
    258    case 440:
    259    case 450:
    260    case 460:
    261       ctx->Const.MaxClipPlanes = 8;
    262       ctx->Const.MaxDrawBuffers = 8;
    263       ctx->Const.MinProgramTexelOffset = -8;
    264       ctx->Const.MaxProgramTexelOffset = 7;
    265       ctx->Const.MaxLights = 8;
    266       ctx->Const.MaxTextureCoordUnits = 8;
    267       ctx->Const.MaxTextureUnits = 2;
    268       ctx->Const.MaxUniformBufferBindings = 84;
    269       ctx->Const.MaxVertexStreams = 4;
    270       ctx->Const.MaxTransformFeedbackBuffers = 4;
    271 
    272       ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16;
    273       ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 16;
    274       ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 1024;
    275       ctx->Const.Program[MESA_SHADER_VERTEX].MaxCombinedUniformComponents = 1024;
    276       ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */
    277       ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 64;
    278 
    279       ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits = 16;
    280       ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxUniformComponents = 1024;
    281       ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxCombinedUniformComponents = 1024;
    282       ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxInputComponents =
    283          ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents;
    284       ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxOutputComponents = 128;
    285 
    286       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = 16;
    287       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 1024;
    288       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxCombinedUniformComponents = 1024;
    289       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents =
    290          ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxOutputComponents;
    291       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */
    292 
    293       ctx->Const.MaxCombinedTextureImageUnits =
    294          ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits
    295          + ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits
    296          + ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits;
    297 
    298       ctx->Const.MaxGeometryOutputVertices = 256;
    299       ctx->Const.MaxGeometryTotalOutputComponents = 1024;
    300 
    301       ctx->Const.MaxVarying = 60 / 4;
    302       break;
    303    case 300:
    304       ctx->Const.MaxClipPlanes = 8;
    305       ctx->Const.MaxCombinedTextureImageUnits = 32;
    306       ctx->Const.MaxDrawBuffers = 4;
    307       ctx->Const.MinProgramTexelOffset = -8;
    308       ctx->Const.MaxProgramTexelOffset = 7;
    309       ctx->Const.MaxLights = 0;
    310       ctx->Const.MaxTextureCoordUnits = 0;
    311       ctx->Const.MaxTextureUnits = 0;
    312       ctx->Const.MaxUniformBufferBindings = 84;
    313       ctx->Const.MaxVertexStreams = 4;
    314       ctx->Const.MaxTransformFeedbackBuffers = 4;
    315 
    316       ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16;
    317       ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 16;
    318       ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 1024;
    319       ctx->Const.Program[MESA_SHADER_VERTEX].MaxCombinedUniformComponents = 1024;
    320       ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */
    321       ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 16 * 4;
    322 
    323       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = 16;
    324       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 224;
    325       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxCombinedUniformComponents = 224;
    326       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = 15 * 4;
    327       ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */
    328 
    329       ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents / 4;
    330       break;
    331    }
    332 
    333    ctx->Const.GenerateTemporaryNames = true;
    334    ctx->Const.MaxPatchVertices = 32;
    335 
    336    /* GL_ARB_explicit_uniform_location, GL_MAX_UNIFORM_LOCATIONS */
    337    ctx->Const.MaxUserAssignableUniformLocations =
    338       4 * MESA_SHADER_STAGES * MAX_UNIFORMS;
    339 
    340    ctx->Driver.NewProgram = new_program;
    341 }
    342 
    343 /* Returned string will have 'ctx' as its ralloc owner. */
    344 static char *
    345 load_text_file(void *ctx, const char *file_name)
    346 {
    347    char *text = NULL;
    348    size_t size;
    349    size_t total_read = 0;
    350    FILE *fp = fopen(file_name, "rb");
    351 
    352    if (!fp) {
    353       return NULL;
    354    }
    355 
    356    fseek(fp, 0L, SEEK_END);
    357    size = ftell(fp);
    358    fseek(fp, 0L, SEEK_SET);
    359 
    360    text = (char *) ralloc_size(ctx, size + 1);
    361    if (text != NULL) {
    362       do {
    363          size_t bytes = fread(text + total_read,
    364                1, size - total_read, fp);
    365          if (bytes < size - total_read) {
    366             free(text);
    367             text = NULL;
    368             goto error;
    369          }
    370 
    371          if (bytes == 0) {
    372             break;
    373          }
    374 
    375          total_read += bytes;
    376       } while (total_read < size);
    377 
    378       text[total_read] = '\0';
    379       error:;
    380    }
    381 
    382    fclose(fp);
    383 
    384    return text;
    385 }
    386 
    387 static void
    388 compile_shader(struct gl_context *ctx, struct gl_shader *shader)
    389 {
    390    struct _mesa_glsl_parse_state *state =
    391       new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader);
    392 
    393    _mesa_glsl_compile_shader(ctx, shader, options->dump_ast,
    394                              options->dump_hir, true);
    395 
    396    /* Print out the resulting IR */
    397    if (!state->error && options->dump_lir) {
    398       _mesa_print_ir(stdout, shader->ir, state);
    399    }
    400 
    401    return;
    402 }
    403 
    404 extern "C" struct gl_shader_program *
    405 standalone_compile_shader(const struct standalone_options *_options,
    406       unsigned num_files, char* const* files)
    407 {
    408    int status = EXIT_SUCCESS;
    409    static struct gl_context local_ctx;
    410    struct gl_context *ctx = &local_ctx;
    411    bool glsl_es = false;
    412 
    413    options = _options;
    414 
    415    switch (options->glsl_version) {
    416    case 100:
    417    case 300:
    418       glsl_es = true;
    419       break;
    420    case 110:
    421    case 120:
    422    case 130:
    423    case 140:
    424    case 150:
    425    case 330:
    426    case 400:
    427    case 410:
    428    case 420:
    429    case 430:
    430    case 440:
    431    case 450:
    432    case 460:
    433       glsl_es = false;
    434       break;
    435    default:
    436       fprintf(stderr, "Unrecognized GLSL version `%d'\n", options->glsl_version);
    437       return NULL;
    438    }
    439 
    440    if (glsl_es) {
    441       initialize_context(ctx, API_OPENGLES2);
    442    } else {
    443       initialize_context(ctx, options->glsl_version > 130 ? API_OPENGL_CORE : API_OPENGL_COMPAT);
    444    }
    445 
    446    struct gl_shader_program *whole_program;
    447 
    448    whole_program = rzalloc (NULL, struct gl_shader_program);
    449    assert(whole_program != NULL);
    450    whole_program->data = rzalloc(whole_program, struct gl_shader_program_data);
    451    assert(whole_program->data != NULL);
    452    whole_program->data->InfoLog = ralloc_strdup(whole_program->data, "");
    453 
    454    /* Created just to avoid segmentation faults */
    455    whole_program->AttributeBindings = new string_to_uint_map;
    456    whole_program->FragDataBindings = new string_to_uint_map;
    457    whole_program->FragDataIndexBindings = new string_to_uint_map;
    458 
    459    for (unsigned i = 0; i < num_files; i++) {
    460       whole_program->Shaders =
    461             reralloc(whole_program, whole_program->Shaders,
    462                   struct gl_shader *, whole_program->NumShaders + 1);
    463       assert(whole_program->Shaders != NULL);
    464 
    465       struct gl_shader *shader = rzalloc(whole_program, gl_shader);
    466 
    467       whole_program->Shaders[whole_program->NumShaders] = shader;
    468       whole_program->NumShaders++;
    469 
    470       const unsigned len = strlen(files[i]);
    471       if (len < 6)
    472          goto fail;
    473 
    474       const char *const ext = & files[i][len - 5];
    475       /* TODO add support to read a .shader_test */
    476       if (strncmp(".vert", ext, 5) == 0 || strncmp(".glsl", ext, 5) == 0)
    477 	 shader->Type = GL_VERTEX_SHADER;
    478       else if (strncmp(".tesc", ext, 5) == 0)
    479 	 shader->Type = GL_TESS_CONTROL_SHADER;
    480       else if (strncmp(".tese", ext, 5) == 0)
    481 	 shader->Type = GL_TESS_EVALUATION_SHADER;
    482       else if (strncmp(".geom", ext, 5) == 0)
    483 	 shader->Type = GL_GEOMETRY_SHADER;
    484       else if (strncmp(".frag", ext, 5) == 0)
    485 	 shader->Type = GL_FRAGMENT_SHADER;
    486       else if (strncmp(".comp", ext, 5) == 0)
    487          shader->Type = GL_COMPUTE_SHADER;
    488       else
    489          goto fail;
    490       shader->Stage = _mesa_shader_enum_to_shader_stage(shader->Type);
    491 
    492       shader->Source = load_text_file(whole_program, files[i]);
    493       if (shader->Source == NULL) {
    494          printf("File \"%s\" does not exist.\n", files[i]);
    495          exit(EXIT_FAILURE);
    496       }
    497 
    498       compile_shader(ctx, shader);
    499 
    500       if (strlen(shader->InfoLog) > 0) {
    501          if (!options->just_log)
    502             printf("Info log for %s:\n", files[i]);
    503 
    504          printf("%s", shader->InfoLog);
    505          if (!options->just_log)
    506             printf("\n");
    507       }
    508 
    509       if (!shader->CompileStatus) {
    510          status = EXIT_FAILURE;
    511          break;
    512       }
    513    }
    514 
    515    if (status == EXIT_SUCCESS) {
    516       _mesa_clear_shader_program_data(ctx, whole_program);
    517 
    518       if (options->do_link)  {
    519          link_shaders(ctx, whole_program);
    520       } else {
    521          const gl_shader_stage stage = whole_program->Shaders[0]->Stage;
    522 
    523          whole_program->data->LinkStatus = linking_success;
    524          whole_program->_LinkedShaders[stage] =
    525             link_intrastage_shaders(whole_program /* mem_ctx */,
    526                                     ctx,
    527                                     whole_program,
    528                                     whole_program->Shaders,
    529                                     1,
    530                                     true);
    531 
    532          /* Par-linking can fail, for example, if there are undefined external
    533           * references.
    534           */
    535          if (whole_program->_LinkedShaders[stage] != NULL) {
    536             assert(whole_program->data->LinkStatus);
    537 
    538             struct gl_shader_compiler_options *const compiler_options =
    539                &ctx->Const.ShaderCompilerOptions[stage];
    540 
    541             exec_list *const ir =
    542                whole_program->_LinkedShaders[stage]->ir;
    543 
    544             bool progress;
    545             do {
    546                progress = do_function_inlining(ir);
    547 
    548                progress = do_common_optimization(ir,
    549                                                  false,
    550                                                  false,
    551                                                  compiler_options,
    552                                                  true)
    553                   && progress;
    554             } while(progress);
    555          }
    556       }
    557 
    558       status = (whole_program->data->LinkStatus) ? EXIT_SUCCESS : EXIT_FAILURE;
    559 
    560       if (strlen(whole_program->data->InfoLog) > 0) {
    561          printf("\n");
    562          if (!options->just_log)
    563             printf("Info log for linking:\n");
    564          printf("%s", whole_program->data->InfoLog);
    565          if (!options->just_log)
    566             printf("\n");
    567       }
    568 
    569       for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
    570          struct gl_linked_shader *shader = whole_program->_LinkedShaders[i];
    571 
    572          if (!shader)
    573             continue;
    574 
    575          add_neg_to_sub_visitor v;
    576          visit_list_elements(&v, shader->ir);
    577 
    578          dead_variable_visitor dv;
    579          visit_list_elements(&dv, shader->ir);
    580          dv.remove_dead_variables();
    581       }
    582 
    583       if (options->dump_builder) {
    584          for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
    585             struct gl_linked_shader *shader = whole_program->_LinkedShaders[i];
    586 
    587             if (!shader)
    588                continue;
    589 
    590             _mesa_print_builder_for_ir(stdout, shader->ir);
    591          }
    592       }
    593    }
    594 
    595    return whole_program;
    596 
    597 fail:
    598    for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
    599       if (whole_program->_LinkedShaders[i])
    600          ralloc_free(whole_program->_LinkedShaders[i]->Program);
    601    }
    602 
    603    ralloc_free(whole_program);
    604    return NULL;
    605 }
    606 
    607 extern "C" void
    608 standalone_compiler_cleanup(struct gl_shader_program *whole_program)
    609 {
    610    for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
    611       if (whole_program->_LinkedShaders[i])
    612          ralloc_free(whole_program->_LinkedShaders[i]->Program);
    613    }
    614 
    615    delete whole_program->AttributeBindings;
    616    delete whole_program->FragDataBindings;
    617    delete whole_program->FragDataIndexBindings;
    618 
    619    ralloc_free(whole_program);
    620    _mesa_glsl_release_types();
    621    _mesa_glsl_release_builtin_functions();
    622 }
    623