standalone.cpp revision 7ec681f3
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#include "main/mtypes.h"
47#include "program/program.h"
48
49class dead_variable_visitor : public ir_hierarchical_visitor {
50public:
51   dead_variable_visitor()
52   {
53      variables = _mesa_pointer_set_create(NULL);
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      set_foreach(variables, entry) {
90         ir_variable *ir = (ir_variable *) entry->key;
91
92         assert(ir->ir_type == ir_type_variable);
93         ir->remove();
94      }
95   }
96
97private:
98   set *variables;
99};
100
101static void
102init_gl_program(struct gl_program *prog, bool is_arb_asm, gl_shader_stage stage)
103{
104   prog->RefCount = 1;
105   prog->Format = GL_PROGRAM_FORMAT_ASCII_ARB;
106   prog->info.is_arb_asm = is_arb_asm;
107   prog->info.stage = stage;
108}
109
110static struct gl_program *
111new_program(UNUSED struct gl_context *ctx, gl_shader_stage stage,
112            UNUSED GLuint id, bool is_arb_asm)
113{
114   struct gl_program *prog = rzalloc(NULL, struct gl_program);
115   init_gl_program(prog, is_arb_asm, stage);
116   return prog;
117}
118
119static const struct standalone_options *options;
120
121static void
122initialize_context(struct gl_context *ctx, gl_api api)
123{
124   initialize_context_to_defaults(ctx, api);
125   _mesa_glsl_builtin_functions_init_or_ref();
126
127   /* The standalone compiler needs to claim support for almost
128    * everything in order to compile the built-in functions.
129    */
130   ctx->Const.GLSLVersion = options->glsl_version;
131   ctx->Extensions.ARB_ES3_compatibility = true;
132   ctx->Extensions.ARB_ES3_1_compatibility = true;
133   ctx->Extensions.ARB_ES3_2_compatibility = true;
134   ctx->Const.MaxComputeWorkGroupCount[0] = 65535;
135   ctx->Const.MaxComputeWorkGroupCount[1] = 65535;
136   ctx->Const.MaxComputeWorkGroupCount[2] = 65535;
137   ctx->Const.MaxComputeWorkGroupSize[0] = 1024;
138   ctx->Const.MaxComputeWorkGroupSize[1] = 1024;
139   ctx->Const.MaxComputeWorkGroupSize[2] = 64;
140   ctx->Const.MaxComputeWorkGroupInvocations = 1024;
141   ctx->Const.MaxComputeSharedMemorySize = 32768;
142   ctx->Const.MaxComputeVariableGroupSize[0] = 512;
143   ctx->Const.MaxComputeVariableGroupSize[1] = 512;
144   ctx->Const.MaxComputeVariableGroupSize[2] = 64;
145   ctx->Const.MaxComputeVariableGroupInvocations = 512;
146   ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = 16;
147   ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformComponents = 1024;
148   ctx->Const.Program[MESA_SHADER_COMPUTE].MaxCombinedUniformComponents = 1024;
149   ctx->Const.Program[MESA_SHADER_COMPUTE].MaxInputComponents = 0; /* not used */
150   ctx->Const.Program[MESA_SHADER_COMPUTE].MaxOutputComponents = 0; /* not used */
151   ctx->Const.Program[MESA_SHADER_COMPUTE].MaxAtomicBuffers = 8;
152   ctx->Const.Program[MESA_SHADER_COMPUTE].MaxAtomicCounters = 8;
153   ctx->Const.Program[MESA_SHADER_COMPUTE].MaxImageUniforms = 8;
154   ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformBlocks = 12;
155
156   switch (ctx->Const.GLSLVersion) {
157   case 100:
158      ctx->Const.MaxClipPlanes = 0;
159      ctx->Const.MaxCombinedTextureImageUnits = 8;
160      ctx->Const.MaxDrawBuffers = 2;
161      ctx->Const.MinProgramTexelOffset = 0;
162      ctx->Const.MaxProgramTexelOffset = 0;
163      ctx->Const.MaxLights = 0;
164      ctx->Const.MaxTextureCoordUnits = 0;
165      ctx->Const.MaxTextureUnits = 8;
166
167      ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 8;
168      ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 0;
169      ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 128 * 4;
170      ctx->Const.Program[MESA_SHADER_VERTEX].MaxCombinedUniformComponents = 128 * 4;
171      ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */
172      ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 32;
173
174      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits =
175         ctx->Const.MaxCombinedTextureImageUnits;
176      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 16 * 4;
177      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxCombinedUniformComponents = 16 * 4;
178      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents =
179         ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents;
180      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */
181
182      ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4;
183      break;
184   case 110:
185   case 120:
186      ctx->Const.MaxClipPlanes = 6;
187      ctx->Const.MaxCombinedTextureImageUnits = 2;
188      ctx->Const.MaxDrawBuffers = 1;
189      ctx->Const.MinProgramTexelOffset = 0;
190      ctx->Const.MaxProgramTexelOffset = 0;
191      ctx->Const.MaxLights = 8;
192      ctx->Const.MaxTextureCoordUnits = 2;
193      ctx->Const.MaxTextureUnits = 2;
194
195      ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16;
196      ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 0;
197      ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 512;
198      ctx->Const.Program[MESA_SHADER_VERTEX].MaxCombinedUniformComponents = 512;
199      ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */
200      ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 32;
201
202      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits =
203         ctx->Const.MaxCombinedTextureImageUnits;
204      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 64;
205      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxCombinedUniformComponents = 64;
206      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents =
207         ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents;
208      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */
209
210      ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4;
211      break;
212   case 130:
213   case 140:
214      ctx->Const.MaxClipPlanes = 8;
215      ctx->Const.MaxCombinedTextureImageUnits = 16;
216      ctx->Const.MaxDrawBuffers = 8;
217      ctx->Const.MinProgramTexelOffset = -8;
218      ctx->Const.MaxProgramTexelOffset = 7;
219      ctx->Const.MaxLights = 8;
220      ctx->Const.MaxTextureCoordUnits = 8;
221      ctx->Const.MaxTextureUnits = 2;
222      ctx->Const.MaxUniformBufferBindings = 84;
223      ctx->Const.MaxVertexStreams = 4;
224      ctx->Const.MaxTransformFeedbackBuffers = 4;
225
226      ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16;
227      ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 16;
228      ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 1024;
229      ctx->Const.Program[MESA_SHADER_VERTEX].MaxCombinedUniformComponents = 1024;
230      ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */
231      ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 64;
232
233      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = 16;
234      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 1024;
235      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxCombinedUniformComponents = 1024;
236      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents =
237         ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents;
238      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */
239
240      ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4;
241      break;
242   case 150:
243   case 330:
244   case 400:
245   case 410:
246   case 420:
247   case 430:
248   case 440:
249   case 450:
250   case 460:
251      ctx->Const.MaxClipPlanes = 8;
252      ctx->Const.MaxDrawBuffers = 8;
253      ctx->Const.MinProgramTexelOffset = -8;
254      ctx->Const.MaxProgramTexelOffset = 7;
255      ctx->Const.MaxLights = 8;
256      ctx->Const.MaxTextureCoordUnits = 8;
257      ctx->Const.MaxTextureUnits = 2;
258      ctx->Const.MaxUniformBufferBindings = 84;
259      ctx->Const.MaxVertexStreams = 4;
260      ctx->Const.MaxTransformFeedbackBuffers = 4;
261      ctx->Const.MaxShaderStorageBufferBindings = 4;
262      ctx->Const.MaxShaderStorageBlockSize = 4096;
263      ctx->Const.MaxAtomicBufferBindings = 4;
264
265      ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16;
266      ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 16;
267      ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 1024;
268      ctx->Const.Program[MESA_SHADER_VERTEX].MaxCombinedUniformComponents = 1024;
269      ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */
270      ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 64;
271
272      ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits = 16;
273      ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxUniformComponents = 1024;
274      ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxCombinedUniformComponents = 1024;
275      ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxInputComponents =
276         ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents;
277      ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxOutputComponents = 128;
278
279      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = 16;
280      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 1024;
281      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxCombinedUniformComponents = 1024;
282      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents =
283         ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxOutputComponents;
284      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */
285
286      ctx->Const.MaxCombinedTextureImageUnits =
287         ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits
288         + ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits
289         + ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits;
290
291      ctx->Const.MaxGeometryOutputVertices = 256;
292      ctx->Const.MaxGeometryTotalOutputComponents = 1024;
293
294      ctx->Const.MaxVarying = 60 / 4;
295      break;
296   case 300:
297      ctx->Const.MaxClipPlanes = 8;
298      ctx->Const.MaxCombinedTextureImageUnits = 32;
299      ctx->Const.MaxDrawBuffers = 4;
300      ctx->Const.MinProgramTexelOffset = -8;
301      ctx->Const.MaxProgramTexelOffset = 7;
302      ctx->Const.MaxLights = 0;
303      ctx->Const.MaxTextureCoordUnits = 0;
304      ctx->Const.MaxTextureUnits = 0;
305      ctx->Const.MaxUniformBufferBindings = 84;
306      ctx->Const.MaxVertexStreams = 4;
307      ctx->Const.MaxTransformFeedbackBuffers = 4;
308
309      ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16;
310      ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 16;
311      ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 1024;
312      ctx->Const.Program[MESA_SHADER_VERTEX].MaxCombinedUniformComponents = 1024;
313      ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */
314      ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 16 * 4;
315
316      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = 16;
317      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 224;
318      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxCombinedUniformComponents = 224;
319      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = 15 * 4;
320      ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */
321
322      ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents / 4;
323      break;
324   }
325
326   ctx->Const.GenerateTemporaryNames = true;
327   ctx->Const.MaxPatchVertices = 32;
328
329   /* GL_ARB_explicit_uniform_location, GL_MAX_UNIFORM_LOCATIONS */
330   ctx->Const.MaxUserAssignableUniformLocations =
331      4 * MESA_SHADER_STAGES * MAX_UNIFORMS;
332
333   ctx->Driver.NewProgram = new_program;
334}
335
336/* Returned string will have 'ctx' as its ralloc owner. */
337static char *
338load_text_file(void *ctx, const char *file_name)
339{
340   char *text = NULL;
341   size_t size;
342   size_t total_read = 0;
343   FILE *fp = fopen(file_name, "rb");
344
345   if (!fp) {
346      return NULL;
347   }
348
349   fseek(fp, 0L, SEEK_END);
350   size = ftell(fp);
351   fseek(fp, 0L, SEEK_SET);
352
353   text = (char *) ralloc_size(ctx, size + 1);
354   if (text != NULL) {
355      do {
356         size_t bytes = fread(text + total_read,
357               1, size - total_read, fp);
358         if (bytes < size - total_read) {
359            free(text);
360            text = NULL;
361            goto error;
362         }
363
364         if (bytes == 0) {
365            break;
366         }
367
368         total_read += bytes;
369      } while (total_read < size);
370
371      text[total_read] = '\0';
372      error:;
373   }
374
375   fclose(fp);
376
377   return text;
378}
379
380static void
381compile_shader(struct gl_context *ctx, struct gl_shader *shader)
382{
383   _mesa_glsl_compile_shader(ctx, shader, options->dump_ast,
384                             options->dump_hir, true);
385
386   /* Print out the resulting IR */
387   if (shader->CompileStatus == COMPILE_SUCCESS && options->dump_lir) {
388      _mesa_print_ir(stdout, shader->ir, NULL);
389   }
390
391   return;
392}
393
394extern "C" struct gl_shader_program *
395standalone_compile_shader(const struct standalone_options *_options,
396      unsigned num_files, char* const* files, struct gl_context *ctx)
397{
398   int status = EXIT_SUCCESS;
399   bool glsl_es = false;
400
401   options = _options;
402
403   switch (options->glsl_version) {
404   case 100:
405   case 300:
406      glsl_es = true;
407      break;
408   case 110:
409   case 120:
410   case 130:
411   case 140:
412   case 150:
413   case 330:
414   case 400:
415   case 410:
416   case 420:
417   case 430:
418   case 440:
419   case 450:
420   case 460:
421      glsl_es = false;
422      break;
423   default:
424      fprintf(stderr, "Unrecognized GLSL version `%d'\n", options->glsl_version);
425      return NULL;
426   }
427
428   if (glsl_es) {
429      initialize_context(ctx, API_OPENGLES2);
430   } else {
431      initialize_context(ctx, options->glsl_version > 130 ? API_OPENGL_CORE : API_OPENGL_COMPAT);
432   }
433
434   if (options->lower_precision) {
435      for (unsigned i = MESA_SHADER_VERTEX; i <= MESA_SHADER_COMPUTE; i++) {
436         struct gl_shader_compiler_options *options =
437            &ctx->Const.ShaderCompilerOptions[i];
438         options->LowerPrecisionFloat16 = true;
439         options->LowerPrecisionInt16 = true;
440         options->LowerPrecisionDerivatives = true;
441         options->LowerPrecisionConstants = true;
442         options->LowerPrecisionFloat16Uniforms = true;
443      }
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
597fail:
598   for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
599      if (whole_program->_LinkedShaders[i])
600         _mesa_delete_linked_shader(ctx, whole_program->_LinkedShaders[i]);
601   }
602
603   ralloc_free(whole_program);
604   return NULL;
605}
606
607extern "C" void
608standalone_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         _mesa_delete_linked_shader(NULL, whole_program->_LinkedShaders[i]);
613   }
614
615   delete whole_program->AttributeBindings;
616   delete whole_program->FragDataBindings;
617   delete whole_program->FragDataIndexBindings;
618   delete whole_program->UniformHash;
619
620   ralloc_free(whole_program);
621   _mesa_glsl_builtin_functions_decref();
622}
623