glsl: add enable flags for ARB_compute_variable_group_size
[mesa.git] / src / compiler / glsl / standalone.cpp
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 "util/string_to_uint_map.h"
40
41 static const struct standalone_options *options;
42
43 static void
44 initialize_context(struct gl_context *ctx, gl_api api)
45 {
46 initialize_context_to_defaults(ctx, api);
47
48 /* The standalone compiler needs to claim support for almost
49 * everything in order to compile the built-in functions.
50 */
51 ctx->Const.GLSLVersion = options->glsl_version;
52 ctx->Extensions.ARB_ES3_compatibility = true;
53 ctx->Const.MaxComputeWorkGroupCount[0] = 65535;
54 ctx->Const.MaxComputeWorkGroupCount[1] = 65535;
55 ctx->Const.MaxComputeWorkGroupCount[2] = 65535;
56 ctx->Const.MaxComputeWorkGroupSize[0] = 1024;
57 ctx->Const.MaxComputeWorkGroupSize[1] = 1024;
58 ctx->Const.MaxComputeWorkGroupSize[2] = 64;
59 ctx->Const.MaxComputeWorkGroupInvocations = 1024;
60 ctx->Const.MaxComputeSharedMemorySize = 32768;
61 ctx->Const.MaxComputeVariableGroupSize[0] = 512;
62 ctx->Const.MaxComputeVariableGroupSize[1] = 512;
63 ctx->Const.MaxComputeVariableGroupSize[2] = 64;
64 ctx->Const.MaxComputeVariableGroupInvocations = 512;
65 ctx->Const.Program[MESA_SHADER_COMPUTE].MaxTextureImageUnits = 16;
66 ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformComponents = 1024;
67 ctx->Const.Program[MESA_SHADER_COMPUTE].MaxCombinedUniformComponents = 1024;
68 ctx->Const.Program[MESA_SHADER_COMPUTE].MaxInputComponents = 0; /* not used */
69 ctx->Const.Program[MESA_SHADER_COMPUTE].MaxOutputComponents = 0; /* not used */
70 ctx->Const.Program[MESA_SHADER_COMPUTE].MaxAtomicBuffers = 8;
71 ctx->Const.Program[MESA_SHADER_COMPUTE].MaxAtomicCounters = 8;
72 ctx->Const.Program[MESA_SHADER_COMPUTE].MaxImageUniforms = 8;
73 ctx->Const.Program[MESA_SHADER_COMPUTE].MaxUniformBlocks = 12;
74
75 switch (ctx->Const.GLSLVersion) {
76 case 100:
77 ctx->Const.MaxClipPlanes = 0;
78 ctx->Const.MaxCombinedTextureImageUnits = 8;
79 ctx->Const.MaxDrawBuffers = 2;
80 ctx->Const.MinProgramTexelOffset = 0;
81 ctx->Const.MaxProgramTexelOffset = 0;
82 ctx->Const.MaxLights = 0;
83 ctx->Const.MaxTextureCoordUnits = 0;
84 ctx->Const.MaxTextureUnits = 8;
85
86 ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 8;
87 ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 0;
88 ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 128 * 4;
89 ctx->Const.Program[MESA_SHADER_VERTEX].MaxCombinedUniformComponents = 128 * 4;
90 ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */
91 ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 32;
92
93 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits =
94 ctx->Const.MaxCombinedTextureImageUnits;
95 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 16 * 4;
96 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxCombinedUniformComponents = 16 * 4;
97 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents =
98 ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents;
99 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */
100
101 ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4;
102 break;
103 case 110:
104 case 120:
105 ctx->Const.MaxClipPlanes = 6;
106 ctx->Const.MaxCombinedTextureImageUnits = 2;
107 ctx->Const.MaxDrawBuffers = 1;
108 ctx->Const.MinProgramTexelOffset = 0;
109 ctx->Const.MaxProgramTexelOffset = 0;
110 ctx->Const.MaxLights = 8;
111 ctx->Const.MaxTextureCoordUnits = 2;
112 ctx->Const.MaxTextureUnits = 2;
113
114 ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16;
115 ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 0;
116 ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 512;
117 ctx->Const.Program[MESA_SHADER_VERTEX].MaxCombinedUniformComponents = 512;
118 ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */
119 ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 32;
120
121 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits =
122 ctx->Const.MaxCombinedTextureImageUnits;
123 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 64;
124 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxCombinedUniformComponents = 64;
125 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents =
126 ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents;
127 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */
128
129 ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4;
130 break;
131 case 130:
132 case 140:
133 ctx->Const.MaxClipPlanes = 8;
134 ctx->Const.MaxCombinedTextureImageUnits = 16;
135 ctx->Const.MaxDrawBuffers = 8;
136 ctx->Const.MinProgramTexelOffset = -8;
137 ctx->Const.MaxProgramTexelOffset = 7;
138 ctx->Const.MaxLights = 8;
139 ctx->Const.MaxTextureCoordUnits = 8;
140 ctx->Const.MaxTextureUnits = 2;
141
142 ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16;
143 ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 16;
144 ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 1024;
145 ctx->Const.Program[MESA_SHADER_VERTEX].MaxCombinedUniformComponents = 1024;
146 ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */
147 ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 64;
148
149 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = 16;
150 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 1024;
151 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxCombinedUniformComponents = 1024;
152 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents =
153 ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents;
154 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */
155
156 ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents / 4;
157 break;
158 case 150:
159 case 330:
160 case 400:
161 case 410:
162 case 420:
163 case 430:
164 case 440:
165 case 450:
166 ctx->Const.MaxClipPlanes = 8;
167 ctx->Const.MaxDrawBuffers = 8;
168 ctx->Const.MinProgramTexelOffset = -8;
169 ctx->Const.MaxProgramTexelOffset = 7;
170 ctx->Const.MaxLights = 8;
171 ctx->Const.MaxTextureCoordUnits = 8;
172 ctx->Const.MaxTextureUnits = 2;
173
174 ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16;
175 ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 16;
176 ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 1024;
177 ctx->Const.Program[MESA_SHADER_VERTEX].MaxCombinedUniformComponents = 1024;
178 ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */
179 ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 64;
180
181 ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits = 16;
182 ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxUniformComponents = 1024;
183 ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxCombinedUniformComponents = 1024;
184 ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxInputComponents =
185 ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents;
186 ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxOutputComponents = 128;
187
188 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = 16;
189 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 1024;
190 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxCombinedUniformComponents = 1024;
191 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents =
192 ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxOutputComponents;
193 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */
194
195 ctx->Const.MaxCombinedTextureImageUnits =
196 ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits
197 + ctx->Const.Program[MESA_SHADER_GEOMETRY].MaxTextureImageUnits
198 + ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits;
199
200 ctx->Const.MaxGeometryOutputVertices = 256;
201 ctx->Const.MaxGeometryTotalOutputComponents = 1024;
202
203 ctx->Const.MaxVarying = 60 / 4;
204 break;
205 case 300:
206 ctx->Const.MaxClipPlanes = 8;
207 ctx->Const.MaxCombinedTextureImageUnits = 32;
208 ctx->Const.MaxDrawBuffers = 4;
209 ctx->Const.MinProgramTexelOffset = -8;
210 ctx->Const.MaxProgramTexelOffset = 7;
211 ctx->Const.MaxLights = 0;
212 ctx->Const.MaxTextureCoordUnits = 0;
213 ctx->Const.MaxTextureUnits = 0;
214
215 ctx->Const.Program[MESA_SHADER_VERTEX].MaxAttribs = 16;
216 ctx->Const.Program[MESA_SHADER_VERTEX].MaxTextureImageUnits = 16;
217 ctx->Const.Program[MESA_SHADER_VERTEX].MaxUniformComponents = 1024;
218 ctx->Const.Program[MESA_SHADER_VERTEX].MaxCombinedUniformComponents = 1024;
219 ctx->Const.Program[MESA_SHADER_VERTEX].MaxInputComponents = 0; /* not used */
220 ctx->Const.Program[MESA_SHADER_VERTEX].MaxOutputComponents = 16 * 4;
221
222 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxTextureImageUnits = 16;
223 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxUniformComponents = 224;
224 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxCombinedUniformComponents = 224;
225 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents = 15 * 4;
226 ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxOutputComponents = 0; /* not used */
227
228 ctx->Const.MaxVarying = ctx->Const.Program[MESA_SHADER_FRAGMENT].MaxInputComponents / 4;
229 break;
230 }
231
232 ctx->Const.GenerateTemporaryNames = true;
233 ctx->Const.MaxPatchVertices = 32;
234
235 /* GL_ARB_explicit_uniform_location, GL_MAX_UNIFORM_LOCATIONS */
236 ctx->Const.MaxUserAssignableUniformLocations =
237 4 * MESA_SHADER_STAGES * MAX_UNIFORMS;
238
239 ctx->Driver.NewShader = _mesa_new_linked_shader;
240 }
241
242 /* Returned string will have 'ctx' as its ralloc owner. */
243 static char *
244 load_text_file(void *ctx, const char *file_name)
245 {
246 char *text = NULL;
247 size_t size;
248 size_t total_read = 0;
249 FILE *fp = fopen(file_name, "rb");
250
251 if (!fp) {
252 return NULL;
253 }
254
255 fseek(fp, 0L, SEEK_END);
256 size = ftell(fp);
257 fseek(fp, 0L, SEEK_SET);
258
259 text = (char *) ralloc_size(ctx, size + 1);
260 if (text != NULL) {
261 do {
262 size_t bytes = fread(text + total_read,
263 1, size - total_read, fp);
264 if (bytes < size - total_read) {
265 free(text);
266 text = NULL;
267 goto error;
268 }
269
270 if (bytes == 0) {
271 break;
272 }
273
274 total_read += bytes;
275 } while (total_read < size);
276
277 text[total_read] = '\0';
278 error:;
279 }
280
281 fclose(fp);
282
283 return text;
284 }
285
286 void
287 compile_shader(struct gl_context *ctx, struct gl_shader *shader)
288 {
289 struct _mesa_glsl_parse_state *state =
290 new(shader) _mesa_glsl_parse_state(ctx, shader->Stage, shader);
291
292 _mesa_glsl_compile_shader(ctx, shader, options->dump_ast, options->dump_hir);
293
294 /* Print out the resulting IR */
295 if (!state->error && options->dump_lir) {
296 _mesa_print_ir(stdout, shader->ir, state);
297 }
298
299 return;
300 }
301
302 void
303 init_gl_program(struct gl_program *prog, GLenum target)
304 {
305 mtx_init(&prog->Mutex, mtx_plain);
306
307 prog->RefCount = 1;
308 prog->Format = GL_PROGRAM_FORMAT_ASCII_ARB;
309
310 /* default mapping from samplers to texture units */
311 for (int i = 0; i < MAX_SAMPLERS; i++)
312 prog->SamplerUnits[i] = i;
313 }
314
315 extern "C" struct gl_shader_program *
316 standalone_compile_shader(const struct standalone_options *_options,
317 unsigned num_files, char* const* files)
318 {
319 int status = EXIT_SUCCESS;
320 static struct gl_context local_ctx;
321 struct gl_context *ctx = &local_ctx;
322 bool glsl_es = false;
323
324 options = _options;
325
326 switch (options->glsl_version) {
327 case 100:
328 case 300:
329 glsl_es = true;
330 break;
331 case 110:
332 case 120:
333 case 130:
334 case 140:
335 case 150:
336 case 330:
337 case 400:
338 case 410:
339 case 420:
340 case 430:
341 case 440:
342 case 450:
343 glsl_es = false;
344 break;
345 default:
346 fprintf(stderr, "Unrecognized GLSL version `%d'\n", options->glsl_version);
347 return NULL;
348 }
349
350 if (glsl_es) {
351 initialize_context(ctx, API_OPENGLES2);
352 } else {
353 initialize_context(ctx, options->glsl_version > 130 ? API_OPENGL_CORE : API_OPENGL_COMPAT);
354 }
355
356 struct gl_shader_program *whole_program;
357
358 whole_program = rzalloc (NULL, struct gl_shader_program);
359 assert(whole_program != NULL);
360 whole_program->InfoLog = ralloc_strdup(whole_program, "");
361
362 /* Created just to avoid segmentation faults */
363 whole_program->AttributeBindings = new string_to_uint_map;
364 whole_program->FragDataBindings = new string_to_uint_map;
365 whole_program->FragDataIndexBindings = new string_to_uint_map;
366
367 for (unsigned i = 0; i < num_files; i++) {
368 whole_program->Shaders =
369 reralloc(whole_program, whole_program->Shaders,
370 struct gl_shader *, whole_program->NumShaders + 1);
371 assert(whole_program->Shaders != NULL);
372
373 struct gl_shader *shader = rzalloc(whole_program, gl_shader);
374
375 whole_program->Shaders[whole_program->NumShaders] = shader;
376 whole_program->NumShaders++;
377
378 const unsigned len = strlen(files[i]);
379 if (len < 6)
380 goto fail;
381
382 const char *const ext = & files[i][len - 5];
383 /* TODO add support to read a .shader_test */
384 if (strncmp(".vert", ext, 5) == 0 || strncmp(".glsl", ext, 5) == 0)
385 shader->Type = GL_VERTEX_SHADER;
386 else if (strncmp(".tesc", ext, 5) == 0)
387 shader->Type = GL_TESS_CONTROL_SHADER;
388 else if (strncmp(".tese", ext, 5) == 0)
389 shader->Type = GL_TESS_EVALUATION_SHADER;
390 else if (strncmp(".geom", ext, 5) == 0)
391 shader->Type = GL_GEOMETRY_SHADER;
392 else if (strncmp(".frag", ext, 5) == 0)
393 shader->Type = GL_FRAGMENT_SHADER;
394 else if (strncmp(".comp", ext, 5) == 0)
395 shader->Type = GL_COMPUTE_SHADER;
396 else
397 goto fail;
398 shader->Stage = _mesa_shader_enum_to_shader_stage(shader->Type);
399
400 shader->Source = load_text_file(whole_program, files[i]);
401 if (shader->Source == NULL) {
402 printf("File \"%s\" does not exist.\n", files[i]);
403 exit(EXIT_FAILURE);
404 }
405
406 compile_shader(ctx, shader);
407
408 if (strlen(shader->InfoLog) > 0) {
409 if (!options->just_log)
410 printf("Info log for %s:\n", files[i]);
411
412 printf("%s", shader->InfoLog);
413 if (!options->just_log)
414 printf("\n");
415 }
416
417 if (!shader->CompileStatus) {
418 status = EXIT_FAILURE;
419 break;
420 }
421 }
422
423 if ((status == EXIT_SUCCESS) && options->do_link) {
424 _mesa_clear_shader_program_data(whole_program);
425
426 link_shaders(ctx, whole_program);
427 status = (whole_program->LinkStatus) ? EXIT_SUCCESS : EXIT_FAILURE;
428
429 if (strlen(whole_program->InfoLog) > 0) {
430 printf("\n");
431 if (!options->just_log)
432 printf("Info log for linking:\n");
433 printf("%s", whole_program->InfoLog);
434 if (!options->just_log)
435 printf("\n");
436 }
437
438 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++) {
439 struct gl_linked_shader *shader = whole_program->_LinkedShaders[i];
440
441 if (!shader)
442 continue;
443
444 shader->Program = rzalloc(shader, gl_program);
445 init_gl_program(shader->Program, shader->Stage);
446 }
447 }
448
449 return whole_program;
450
451 fail:
452 ralloc_free(whole_program);
453 return NULL;
454 }
455
456 extern "C" void
457 standalone_compiler_cleanup(struct gl_shader_program *whole_program)
458 {
459 for (unsigned i = 0; i < MESA_SHADER_STAGES; i++)
460 ralloc_free(whole_program->_LinkedShaders[i]);
461
462 delete whole_program->AttributeBindings;
463 delete whole_program->FragDataBindings;
464 delete whole_program->FragDataIndexBindings;
465
466 ralloc_free(whole_program);
467 _mesa_glsl_release_types();
468 _mesa_glsl_release_builtin_functions();
469 }