blob: 909f35bb5624361c3916f90498dc960e602c6bea [file] [log] [blame]
alokp@chromium.org07620a52010-09-23 17:53:56 +00001//
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +00002// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved.
alokp@chromium.org07620a52010-09-23 17:53:56 +00003// Use of this source code is governed by a BSD-style license that can be
4// found in the LICENSE file.
5//
6
Geoff Lang17732822013-08-29 13:46:49 -04007#include "compiler/translator/BuiltInFunctionEmulator.h"
8#include "compiler/translator/DetectCallDepth.h"
9#include "compiler/translator/ForLoopUnroll.h"
10#include "compiler/translator/Initialize.h"
11#include "compiler/translator/InitializeGLPosition.h"
12#include "compiler/translator/InitializeParseContext.h"
13#include "compiler/translator/MapLongVariableNames.h"
Jamie Madill6b9cb252013-10-17 10:45:47 -040014#include "compiler/translator/ParseContext.h"
Geoff Lang17732822013-08-29 13:46:49 -040015#include "compiler/translator/RenameFunction.h"
16#include "compiler/translator/ShHandle.h"
Zhenyao Mo7cab38b2013-10-15 12:59:30 -070017#include "compiler/translator/UnfoldShortCircuitAST.h"
Geoff Lang17732822013-08-29 13:46:49 -040018#include "compiler/translator/ValidateLimitations.h"
19#include "compiler/translator/ValidateOutputs.h"
20#include "compiler/translator/VariablePacker.h"
21#include "compiler/translator/depgraph/DependencyGraph.h"
22#include "compiler/translator/depgraph/DependencyGraphOutput.h"
23#include "compiler/translator/timing/RestrictFragmentShaderTiming.h"
24#include "compiler/translator/timing/RestrictVertexShaderTiming.h"
shannon.woods@transgaming.comda1ed362013-01-25 21:54:57 +000025#include "third_party/compiler/ArrayBoundsClamper.h"
alokp@chromium.org07620a52010-09-23 17:53:56 +000026
maxvujovic@gmail.com430f5e02012-06-08 17:47:59 +000027bool isWebGLBasedSpec(ShShaderSpec spec)
28{
29 return spec == SH_WEBGL_SPEC || spec == SH_CSS_SHADERS_SPEC;
30}
31
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +000032namespace {
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +000033class TScopedPoolAllocator {
34public:
Alok Priyadarshibc3f1ac2013-09-23 14:57:02 -040035 TScopedPoolAllocator(TPoolAllocator* allocator) : mAllocator(allocator) {
36 mAllocator->push();
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +000037 SetGlobalPoolAllocator(mAllocator);
38 }
39 ~TScopedPoolAllocator() {
40 SetGlobalPoolAllocator(NULL);
Alok Priyadarshibc3f1ac2013-09-23 14:57:02 -040041 mAllocator->pop();
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +000042 }
43
44private:
45 TPoolAllocator* mAllocator;
Alok Priyadarshibc3f1ac2013-09-23 14:57:02 -040046};
47
48class TScopedSymbolTableLevel {
49public:
50 TScopedSymbolTableLevel(TSymbolTable* table) : mTable(table) {
51 ASSERT(mTable->atBuiltInLevel());
52 mTable->push();
53 }
54 ~TScopedSymbolTableLevel() {
55 while (!mTable->atBuiltInLevel())
56 mTable->pop();
57 }
58
59private:
60 TSymbolTable* mTable;
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +000061};
62} // namespace
63
64TShHandleBase::TShHandleBase() {
65 allocator.push();
66 SetGlobalPoolAllocator(&allocator);
67}
68
69TShHandleBase::~TShHandleBase() {
70 SetGlobalPoolAllocator(NULL);
71 allocator.popAll();
72}
73
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000074TCompiler::TCompiler(ShShaderType type, ShShaderSpec spec)
75 : shaderType(type),
zmo@google.comf420c422011-09-12 18:27:59 +000076 shaderSpec(spec),
Jamie Madilleb1a0102013-07-08 13:31:38 -040077 maxUniformVectors(0),
78 maxExpressionComplexity(0),
79 maxCallStackDepth(0),
shannon.woods%transgaming.com@gtempaccount.comcbb6b6a2013-04-13 03:27:47 +000080 fragmentPrecisionHigh(false),
shannon.woods@transgaming.com1d432bb2013-01-25 21:57:28 +000081 clampingStrategy(SH_CLAMP_WITH_CLAMP_INTRINSIC),
zmo@google.com9996b8e2012-01-19 01:43:55 +000082 builtInFunctionEmulator(type)
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000083{
zmo@google.comb9f64aa2012-01-20 00:35:15 +000084 longNameMap = LongNameMap::GetInstance();
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000085}
86
87TCompiler::~TCompiler()
88{
zmo@google.comb9f64aa2012-01-20 00:35:15 +000089 ASSERT(longNameMap);
90 longNameMap->Release();
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000091}
92
93bool TCompiler::Init(const ShBuiltInResources& resources)
alokp@chromium.org07620a52010-09-23 17:53:56 +000094{
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +000095 shaderVersion = 100;
gman@chromium.org8d804792012-10-17 21:33:48 +000096 maxUniformVectors = (shaderType == SH_VERTEX_SHADER) ?
97 resources.MaxVertexUniformVectors :
98 resources.MaxFragmentUniformVectors;
Jamie Madilleb1a0102013-07-08 13:31:38 -040099 maxExpressionComplexity = resources.MaxExpressionComplexity;
100 maxCallStackDepth = resources.MaxCallStackDepth;
Alok Priyadarshibc3f1ac2013-09-23 14:57:02 -0400101
102 SetGlobalPoolAllocator(&allocator);
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +0000103
alokp@chromium.org07620a52010-09-23 17:53:56 +0000104 // Generate built-in symbol table.
105 if (!InitBuiltInSymbolTable(resources))
106 return false;
alokp@chromium.org07620a52010-09-23 17:53:56 +0000107 InitExtensionBehavior(resources, extensionBehavior);
shannon.woods%transgaming.com@gtempaccount.comcbb6b6a2013-04-13 03:27:47 +0000108 fragmentPrecisionHigh = resources.FragmentPrecisionHigh == 1;
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +0000109
shannon.woods@transgaming.com1d432bb2013-01-25 21:57:28 +0000110 arrayBoundsClamper.SetClampingStrategy(resources.ArrayIndexClampingStrategy);
111 clampingStrategy = resources.ArrayIndexClampingStrategy;
112
daniel@transgaming.comc23f4612012-11-28 19:42:57 +0000113 hashFunction = resources.HashFunction;
114
alokp@chromium.org07620a52010-09-23 17:53:56 +0000115 return true;
116}
117
118bool TCompiler::compile(const char* const shaderStrings[],
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000119 size_t numStrings,
alokp@chromium.org07620a52010-09-23 17:53:56 +0000120 int compileOptions)
121{
Alok Priyadarshibc3f1ac2013-09-23 14:57:02 -0400122 TScopedPoolAllocator scopedAlloc(&allocator);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000123 clearResults();
124
125 if (numStrings == 0)
126 return true;
127
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000128 // If compiling for WebGL, validate loop and indexing as well.
maxvujovic@gmail.com430f5e02012-06-08 17:47:59 +0000129 if (isWebGLBasedSpec(shaderSpec))
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000130 compileOptions |= SH_VALIDATE_LOOP_INDEXING;
alokp@chromium.org1f299542010-11-12 15:50:23 +0000131
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000132 // First string is path of source file if flag is set. The actual source follows.
133 const char* sourcePath = NULL;
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000134 size_t firstSource = 0;
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000135 if (compileOptions & SH_SOURCE_PATH)
136 {
137 sourcePath = shaderStrings[0];
138 ++firstSource;
139 }
140
alokp@chromium.org07620a52010-09-23 17:53:56 +0000141 TIntermediate intermediate(infoSink);
142 TParseContext parseContext(symbolTable, extensionBehavior, intermediate,
zmo@google.comdc4b4f82011-06-17 00:42:53 +0000143 shaderType, shaderSpec, compileOptions, true,
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000144 sourcePath, infoSink);
shannon.woods%transgaming.com@gtempaccount.comcbb6b6a2013-04-13 03:27:47 +0000145 parseContext.fragmentPrecisionHigh = fragmentPrecisionHigh;
Alok Priyadarshi8156b6b2013-09-23 14:56:58 -0400146 SetGlobalParseContext(&parseContext);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000147
148 // We preserve symbols at the built-in level from compile-to-compile.
149 // Start pushing the user-defined symbols at global level.
Alok Priyadarshibc3f1ac2013-09-23 14:57:02 -0400150 TScopedSymbolTableLevel scopedSymbolLevel(&symbolTable);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000151
152 // Parse shader.
153 bool success =
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000154 (PaParseStrings(numStrings - firstSource, &shaderStrings[firstSource], NULL, &parseContext) == 0) &&
alokp@chromium.org07620a52010-09-23 17:53:56 +0000155 (parseContext.treeRoot != NULL);
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +0000156
shannon.woods%transgaming.com@gtempaccount.com5524db02013-04-13 03:38:16 +0000157 shaderVersion = parseContext.getShaderVersion();
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +0000158
alokp@chromium.org07620a52010-09-23 17:53:56 +0000159 if (success) {
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000160 TIntermNode* root = parseContext.treeRoot;
161 success = intermediate.postProcess(root);
162
zmo@google.comb1762df2011-07-30 02:04:23 +0000163 if (success)
Jamie Madilleb1a0102013-07-08 13:31:38 -0400164 success = detectCallDepth(root, infoSink, (compileOptions & SH_LIMIT_CALL_STACK_DEPTH) != 0);
zmo@google.comb1762df2011-07-30 02:04:23 +0000165
Jamie Madill05a80ce2013-06-20 11:55:49 -0400166 if (success && shaderVersion == 300 && shaderType == SH_FRAGMENT_SHADER)
167 success = validateOutputs(root);
168
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000169 if (success && (compileOptions & SH_VALIDATE_LOOP_INDEXING))
170 success = validateLimitations(root);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000171
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000172 if (success && (compileOptions & SH_TIMING_RESTRICTIONS))
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000173 success = enforceTimingRestrictions(root, (compileOptions & SH_DEPENDENCY_GRAPH) != 0);
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000174
maxvujovic@gmail.com430f5e02012-06-08 17:47:59 +0000175 if (success && shaderSpec == SH_CSS_SHADERS_SPEC)
176 rewriteCSSShader(root);
177
zmo@google.com0c6bb7a2011-08-17 19:39:58 +0000178 // Unroll for-loop markup needs to happen after validateLimitations pass.
179 if (success && (compileOptions & SH_UNROLL_FOR_LOOP_WITH_INTEGER_INDEX))
180 ForLoopUnroll::MarkForLoopsWithIntegerIndicesForUnrolling(root);
181
zmo@google.com32e97312011-08-24 01:03:11 +0000182 // Built-in function emulation needs to happen after validateLimitations pass.
183 if (success && (compileOptions & SH_EMULATE_BUILT_IN_FUNCTIONS))
184 builtInFunctionEmulator.MarkBuiltInFunctionsForEmulation(root);
185
daniel@transgaming.com4167cc92013-01-11 04:11:53 +0000186 // Clamping uniform array bounds needs to happen after validateLimitations pass.
187 if (success && (compileOptions & SH_CLAMP_INDIRECT_ARRAY_BOUNDS))
188 arrayBoundsClamper.MarkIndirectArrayBoundsForClamping(root);
189
Jamie Madilleb1a0102013-07-08 13:31:38 -0400190 // Disallow expressions deemed too complex.
191 if (success && (compileOptions & SH_LIMIT_EXPRESSION_COMPLEXITY))
192 success = limitExpressionComplexity(root);
193
zmo@google.comfd747b82011-04-23 01:30:07 +0000194 // Call mapLongVariableNames() before collectAttribsUniforms() so in
195 // collectAttribsUniforms() we already have the mapped symbol names and
196 // we could composite mapped and original variable names.
daniel@transgaming.com0aa3b5a2012-11-28 19:43:24 +0000197 // Also, if we hash all the names, then no need to do this for long names.
198 if (success && (compileOptions & SH_MAP_LONG_VARIABLE_NAMES) && hashFunction == NULL)
zmo@google.comfd747b82011-04-23 01:30:07 +0000199 mapLongVariableNames(root);
200
Zhenyao Moac44cd22013-09-23 14:57:09 -0400201 if (success && shaderType == SH_VERTEX_SHADER && (compileOptions & SH_INIT_GL_POSITION)) {
202 InitializeGLPosition initGLPosition;
203 root->traverse(&initGLPosition);
204 }
205
Zhenyao Mo7cab38b2013-10-15 12:59:30 -0700206 if (success && (compileOptions & SH_UNFOLD_SHORT_CIRCUIT)) {
207 UnfoldShortCircuitAST unfoldShortCircuit;
208 root->traverse(&unfoldShortCircuit);
209 unfoldShortCircuit.updateTree();
210 }
211
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400212 if (success && (compileOptions & SH_VARIABLES)) {
213 collectVariables(root);
gman@chromium.org8d804792012-10-17 21:33:48 +0000214 if (compileOptions & SH_ENFORCE_PACKING_RESTRICTIONS) {
215 success = enforcePackingRestrictions();
216 if (!success) {
Jamie Madill075edd82013-07-08 13:30:19 -0400217 infoSink.info.prefix(EPrefixError);
218 infoSink.info << "too many uniforms";
gman@chromium.org8d804792012-10-17 21:33:48 +0000219 }
220 }
221 }
zmo@google.comfd747b82011-04-23 01:30:07 +0000222
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000223 if (success && (compileOptions & SH_INTERMEDIATE_TREE))
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000224 intermediate.outputTree(root);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000225
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000226 if (success && (compileOptions & SH_OBJECT_CODE))
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000227 translate(root);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000228 }
229
230 // Cleanup memory.
231 intermediate.remove(parseContext.treeRoot);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000232
233 return success;
234}
235
Nicolas Capens49a88872013-06-20 09:54:03 -0400236bool TCompiler::InitBuiltInSymbolTable(const ShBuiltInResources &resources)
alokp@chromium.org07620a52010-09-23 17:53:56 +0000237{
shannon.woods%transgaming.com@gtempaccount.com18b4c4b2013-04-13 03:31:40 +0000238 compileResources = resources;
shannonwoods@chromium.org2ac0be92013-05-30 00:02:27 +0000239
Nicolas Capens49a88872013-06-20 09:54:03 -0400240 assert(symbolTable.isEmpty());
241 symbolTable.push(); // COMMON_BUILTINS
242 symbolTable.push(); // ESSL1_BUILTINS
243 symbolTable.push(); // ESSL3_BUILTINS
shannonwoods@chromium.org2ac0be92013-05-30 00:02:27 +0000244
Nicolas Capens49a88872013-06-20 09:54:03 -0400245 TPublicType integer;
246 integer.type = EbtInt;
247 integer.primarySize = 1;
248 integer.secondarySize = 1;
249 integer.array = false;
250
251 TPublicType floatingPoint;
252 floatingPoint.type = EbtFloat;
253 floatingPoint.primarySize = 1;
254 floatingPoint.secondarySize = 1;
255 floatingPoint.array = false;
256
Zhenyao Moa5a1dfc2013-09-23 14:57:03 -0400257 TPublicType sampler;
258 sampler.primarySize = 1;
259 sampler.secondarySize = 1;
260 sampler.array = false;
261
Nicolas Capens49a88872013-06-20 09:54:03 -0400262 switch(shaderType)
263 {
264 case SH_FRAGMENT_SHADER:
265 symbolTable.setDefaultPrecision(integer, EbpMedium);
266 break;
267 case SH_VERTEX_SHADER:
268 symbolTable.setDefaultPrecision(integer, EbpHigh);
269 symbolTable.setDefaultPrecision(floatingPoint, EbpHigh);
270 break;
271 default: assert(false && "Language not supported");
272 }
Zhenyao Moa5a1dfc2013-09-23 14:57:03 -0400273 // We set defaults for all the sampler types, even those that are
274 // only available if an extension exists.
275 for (int samplerType = EbtGuardSamplerBegin + 1;
276 samplerType < EbtGuardSamplerEnd; ++samplerType) {
277 sampler.type = static_cast<TBasicType>(samplerType);
278 symbolTable.setDefaultPrecision(sampler, EbpLow);
279 }
Nicolas Capens49a88872013-06-20 09:54:03 -0400280
Jamie Madill1b452142013-07-12 14:51:11 -0400281 InsertBuiltInFunctions(shaderType, shaderSpec, resources, symbolTable);
Nicolas Capens49a88872013-06-20 09:54:03 -0400282
283 IdentifyBuiltIns(shaderType, shaderSpec, resources, symbolTable);
284
285 return true;
alokp@chromium.org07620a52010-09-23 17:53:56 +0000286}
287
288void TCompiler::clearResults()
289{
daniel@transgaming.com4167cc92013-01-11 04:11:53 +0000290 arrayBoundsClamper.Cleanup();
alokp@chromium.org07620a52010-09-23 17:53:56 +0000291 infoSink.info.erase();
292 infoSink.obj.erase();
293 infoSink.debug.erase();
294
295 attribs.clear();
296 uniforms.clear();
Zhenyao Mod2d340b2013-09-23 14:57:05 -0400297 varyings.clear();
zmo@google.coma3b4ab42011-09-16 00:53:26 +0000298
299 builtInFunctionEmulator.Cleanup();
daniel@transgaming.com0aa3b5a2012-11-28 19:43:24 +0000300
301 nameMap.clear();
alokp@chromium.org07620a52010-09-23 17:53:56 +0000302}
303
Jamie Madilleb1a0102013-07-08 13:31:38 -0400304bool TCompiler::detectCallDepth(TIntermNode* root, TInfoSink& infoSink, bool limitCallStackDepth)
zmo@google.comb1762df2011-07-30 02:04:23 +0000305{
Jamie Madilleb1a0102013-07-08 13:31:38 -0400306 DetectCallDepth detect(infoSink, limitCallStackDepth, maxCallStackDepth);
zmo@google.comb1762df2011-07-30 02:04:23 +0000307 root->traverse(&detect);
Jamie Madilleb1a0102013-07-08 13:31:38 -0400308 switch (detect.detectCallDepth()) {
309 case DetectCallDepth::kErrorNone:
zmo@google.comb1762df2011-07-30 02:04:23 +0000310 return true;
Jamie Madilleb1a0102013-07-08 13:31:38 -0400311 case DetectCallDepth::kErrorMissingMain:
Jamie Madill075edd82013-07-08 13:30:19 -0400312 infoSink.info.prefix(EPrefixError);
313 infoSink.info << "Missing main()";
zmo@google.comb1762df2011-07-30 02:04:23 +0000314 return false;
Jamie Madilleb1a0102013-07-08 13:31:38 -0400315 case DetectCallDepth::kErrorRecursion:
Jamie Madill075edd82013-07-08 13:30:19 -0400316 infoSink.info.prefix(EPrefixError);
317 infoSink.info << "Function recursion detected";
zmo@google.comb1762df2011-07-30 02:04:23 +0000318 return false;
Jamie Madilleb1a0102013-07-08 13:31:38 -0400319 case DetectCallDepth::kErrorMaxDepthExceeded:
320 infoSink.info.prefix(EPrefixError);
321 infoSink.info << "Function call stack too deep";
322 return false;
zmo@google.comb1762df2011-07-30 02:04:23 +0000323 default:
324 UNREACHABLE();
325 return false;
326 }
327}
328
Jamie Madill05a80ce2013-06-20 11:55:49 -0400329bool TCompiler::validateOutputs(TIntermNode* root)
330{
331 ValidateOutputs validateOutputs(infoSink.info, compileResources.MaxDrawBuffers);
332 root->traverse(&validateOutputs);
333 return (validateOutputs.numErrors() == 0);
334}
335
maxvujovic@gmail.com430f5e02012-06-08 17:47:59 +0000336void TCompiler::rewriteCSSShader(TIntermNode* root)
337{
338 RenameFunction renamer("main(", "css_main(");
339 root->traverse(&renamer);
340}
341
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000342bool TCompiler::validateLimitations(TIntermNode* root) {
343 ValidateLimitations validate(shaderType, infoSink.info);
344 root->traverse(&validate);
345 return validate.numErrors() == 0;
346}
347
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000348bool TCompiler::enforceTimingRestrictions(TIntermNode* root, bool outputGraph)
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000349{
350 if (shaderSpec != SH_WEBGL_SPEC) {
351 infoSink.info << "Timing restrictions must be enforced under the WebGL spec.";
352 return false;
353 }
354
355 if (shaderType == SH_FRAGMENT_SHADER) {
356 TDependencyGraph graph(root);
357
358 // Output any errors first.
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000359 bool success = enforceFragmentShaderTimingRestrictions(graph);
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000360
361 // Then, output the dependency graph.
362 if (outputGraph) {
363 TDependencyGraphOutput output(infoSink.info);
364 output.outputAllSpanningTrees(graph);
365 }
366
367 return success;
368 }
369 else {
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000370 return enforceVertexShaderTimingRestrictions(root);
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000371 }
372}
373
Jamie Madilleb1a0102013-07-08 13:31:38 -0400374bool TCompiler::limitExpressionComplexity(TIntermNode* root)
375{
376 TIntermTraverser traverser;
377 root->traverse(&traverser);
378 TDependencyGraph graph(root);
379
380 for (TFunctionCallVector::const_iterator iter = graph.beginUserDefinedFunctionCalls();
381 iter != graph.endUserDefinedFunctionCalls();
382 ++iter)
383 {
384 TGraphFunctionCall* samplerSymbol = *iter;
385 TDependencyGraphTraverser graphTraverser;
386 samplerSymbol->traverse(&graphTraverser);
387 }
388
389 if (traverser.getMaxDepth() > maxExpressionComplexity) {
390 infoSink.info << "Expression too complex.";
391 return false;
392 }
393 return true;
394}
395
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000396bool TCompiler::enforceFragmentShaderTimingRestrictions(const TDependencyGraph& graph)
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000397{
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000398 RestrictFragmentShaderTiming restrictor(infoSink.info);
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000399 restrictor.enforceRestrictions(graph);
400 return restrictor.numErrors() == 0;
401}
402
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000403bool TCompiler::enforceVertexShaderTimingRestrictions(TIntermNode* root)
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000404{
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000405 RestrictVertexShaderTiming restrictor(infoSink.info);
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000406 restrictor.enforceRestrictions(root);
407 return restrictor.numErrors() == 0;
408}
409
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400410void TCompiler::collectVariables(TIntermNode* root)
alokp@chromium.org07620a52010-09-23 17:53:56 +0000411{
Zhenyao Mo74da9f22013-09-23 14:57:01 -0400412 CollectVariables collect(attribs, uniforms, varyings, hashFunction);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000413 root->traverse(&collect);
414}
zmo@google.comfd747b82011-04-23 01:30:07 +0000415
gman@chromium.org8d804792012-10-17 21:33:48 +0000416bool TCompiler::enforcePackingRestrictions()
417{
418 VariablePacker packer;
419 return packer.CheckVariablesWithinPackingLimits(maxUniformVectors, uniforms);
420}
421
zmo@google.comfd747b82011-04-23 01:30:07 +0000422void TCompiler::mapLongVariableNames(TIntermNode* root)
423{
zmo@google.comb9f64aa2012-01-20 00:35:15 +0000424 ASSERT(longNameMap);
425 MapLongVariableNames map(longNameMap);
zmo@google.com9996b8e2012-01-19 01:43:55 +0000426 root->traverse(&map);
zmo@google.comfd747b82011-04-23 01:30:07 +0000427}
428
429int TCompiler::getMappedNameMaxLength() const
430{
kbr@chromium.org22152112011-10-26 01:18:28 +0000431 return MAX_SHORTENED_IDENTIFIER_SIZE + 1;
zmo@google.comfd747b82011-04-23 01:30:07 +0000432}
zmo@google.com5601ea02011-06-10 18:23:25 +0000433
434const TExtensionBehavior& TCompiler::getExtensionBehavior() const
435{
436 return extensionBehavior;
437}
zmo@google.com32e97312011-08-24 01:03:11 +0000438
shannon.woods%transgaming.com@gtempaccount.com18b4c4b2013-04-13 03:31:40 +0000439const ShBuiltInResources& TCompiler::getResources() const
440{
441 return compileResources;
442}
443
daniel@transgaming.com4167cc92013-01-11 04:11:53 +0000444const ArrayBoundsClamper& TCompiler::getArrayBoundsClamper() const
445{
446 return arrayBoundsClamper;
447}
448
shannon.woods@transgaming.com1d432bb2013-01-25 21:57:28 +0000449ShArrayIndexClampingStrategy TCompiler::getArrayIndexClampingStrategy() const
450{
451 return clampingStrategy;
452}
453
454const BuiltInFunctionEmulator& TCompiler::getBuiltInFunctionEmulator() const
455{
456 return builtInFunctionEmulator;
457}