blob: 529c30a2eee992e5a7b856ff47185b2a60f8cd32 [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
zmo@google.com32e97312011-08-24 01:03:11 +00007#include "compiler/BuiltInFunctionEmulator.h"
Jamie Madilleb1a0102013-07-08 13:31:38 -04008#include "compiler/DetectCallDepth.h"
zmo@google.com0c6bb7a2011-08-17 19:39:58 +00009#include "compiler/ForLoopUnroll.h"
alokp@chromium.org07620a52010-09-23 17:53:56 +000010#include "compiler/Initialize.h"
alokp@chromium.org8b851c62012-06-15 16:25:11 +000011#include "compiler/InitializeParseContext.h"
zmo@google.comb9f64aa2012-01-20 00:35:15 +000012#include "compiler/MapLongVariableNames.h"
alokp@chromium.org07620a52010-09-23 17:53:56 +000013#include "compiler/ParseHelper.h"
maxvujovic@gmail.com430f5e02012-06-08 17:47:59 +000014#include "compiler/RenameFunction.h"
alokp@chromium.org07620a52010-09-23 17:53:56 +000015#include "compiler/ShHandle.h"
alokp@chromium.orgb59a7782010-11-24 18:38:33 +000016#include "compiler/ValidateLimitations.h"
Jamie Madill05a80ce2013-06-20 11:55:49 -040017#include "compiler/ValidateOutputs.h"
gman@chromium.org8d804792012-10-17 21:33:48 +000018#include "compiler/VariablePacker.h"
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +000019#include "compiler/depgraph/DependencyGraph.h"
20#include "compiler/depgraph/DependencyGraphOutput.h"
21#include "compiler/timing/RestrictFragmentShaderTiming.h"
22#include "compiler/timing/RestrictVertexShaderTiming.h"
shannon.woods@transgaming.comda1ed362013-01-25 21:54:57 +000023#include "third_party/compiler/ArrayBoundsClamper.h"
alokp@chromium.org07620a52010-09-23 17:53:56 +000024
maxvujovic@gmail.com430f5e02012-06-08 17:47:59 +000025bool isWebGLBasedSpec(ShShaderSpec spec)
26{
27 return spec == SH_WEBGL_SPEC || spec == SH_CSS_SHADERS_SPEC;
28}
29
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +000030namespace {
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +000031class TScopedPoolAllocator {
32public:
33 TScopedPoolAllocator(TPoolAllocator* allocator, bool pushPop)
34 : mAllocator(allocator), mPushPopAllocator(pushPop) {
35 if (mPushPopAllocator) mAllocator->push();
36 SetGlobalPoolAllocator(mAllocator);
37 }
38 ~TScopedPoolAllocator() {
39 SetGlobalPoolAllocator(NULL);
40 if (mPushPopAllocator) mAllocator->pop();
41 }
42
43private:
44 TPoolAllocator* mAllocator;
45 bool mPushPopAllocator;
46};
47} // namespace
48
49TShHandleBase::TShHandleBase() {
50 allocator.push();
51 SetGlobalPoolAllocator(&allocator);
52}
53
54TShHandleBase::~TShHandleBase() {
55 SetGlobalPoolAllocator(NULL);
56 allocator.popAll();
57}
58
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000059TCompiler::TCompiler(ShShaderType type, ShShaderSpec spec)
60 : shaderType(type),
zmo@google.comf420c422011-09-12 18:27:59 +000061 shaderSpec(spec),
Jamie Madilleb1a0102013-07-08 13:31:38 -040062 maxUniformVectors(0),
63 maxExpressionComplexity(0),
64 maxCallStackDepth(0),
shannon.woods%transgaming.com@gtempaccount.comcbb6b6a2013-04-13 03:27:47 +000065 fragmentPrecisionHigh(false),
shannon.woods@transgaming.com1d432bb2013-01-25 21:57:28 +000066 clampingStrategy(SH_CLAMP_WITH_CLAMP_INTRINSIC),
zmo@google.com9996b8e2012-01-19 01:43:55 +000067 builtInFunctionEmulator(type)
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000068{
zmo@google.comb9f64aa2012-01-20 00:35:15 +000069 longNameMap = LongNameMap::GetInstance();
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000070}
71
72TCompiler::~TCompiler()
73{
zmo@google.comb9f64aa2012-01-20 00:35:15 +000074 ASSERT(longNameMap);
75 longNameMap->Release();
alokp@chromium.org4888ceb2010-10-01 21:13:12 +000076}
77
78bool TCompiler::Init(const ShBuiltInResources& resources)
alokp@chromium.org07620a52010-09-23 17:53:56 +000079{
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +000080 shaderVersion = 100;
gman@chromium.org8d804792012-10-17 21:33:48 +000081 maxUniformVectors = (shaderType == SH_VERTEX_SHADER) ?
82 resources.MaxVertexUniformVectors :
83 resources.MaxFragmentUniformVectors;
Jamie Madilleb1a0102013-07-08 13:31:38 -040084 maxExpressionComplexity = resources.MaxExpressionComplexity;
85 maxCallStackDepth = resources.MaxCallStackDepth;
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +000086 TScopedPoolAllocator scopedAlloc(&allocator, false);
87
alokp@chromium.org07620a52010-09-23 17:53:56 +000088 // Generate built-in symbol table.
89 if (!InitBuiltInSymbolTable(resources))
90 return false;
alokp@chromium.org07620a52010-09-23 17:53:56 +000091 InitExtensionBehavior(resources, extensionBehavior);
shannon.woods%transgaming.com@gtempaccount.comcbb6b6a2013-04-13 03:27:47 +000092 fragmentPrecisionHigh = resources.FragmentPrecisionHigh == 1;
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +000093
shannon.woods@transgaming.com1d432bb2013-01-25 21:57:28 +000094 arrayBoundsClamper.SetClampingStrategy(resources.ArrayIndexClampingStrategy);
95 clampingStrategy = resources.ArrayIndexClampingStrategy;
96
daniel@transgaming.comc23f4612012-11-28 19:42:57 +000097 hashFunction = resources.HashFunction;
98
alokp@chromium.org07620a52010-09-23 17:53:56 +000099 return true;
100}
101
102bool TCompiler::compile(const char* const shaderStrings[],
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000103 size_t numStrings,
alokp@chromium.org07620a52010-09-23 17:53:56 +0000104 int compileOptions)
105{
alokp@chromium.orgbafcbaa2010-11-23 19:07:43 +0000106 TScopedPoolAllocator scopedAlloc(&allocator, true);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000107 clearResults();
108
109 if (numStrings == 0)
110 return true;
111
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000112 // If compiling for WebGL, validate loop and indexing as well.
maxvujovic@gmail.com430f5e02012-06-08 17:47:59 +0000113 if (isWebGLBasedSpec(shaderSpec))
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000114 compileOptions |= SH_VALIDATE_LOOP_INDEXING;
alokp@chromium.org1f299542010-11-12 15:50:23 +0000115
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000116 // First string is path of source file if flag is set. The actual source follows.
117 const char* sourcePath = NULL;
shannon.woods@transgaming.comd64b3da2013-02-28 23:19:26 +0000118 size_t firstSource = 0;
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000119 if (compileOptions & SH_SOURCE_PATH)
120 {
121 sourcePath = shaderStrings[0];
122 ++firstSource;
123 }
124
alokp@chromium.org07620a52010-09-23 17:53:56 +0000125 TIntermediate intermediate(infoSink);
126 TParseContext parseContext(symbolTable, extensionBehavior, intermediate,
zmo@google.comdc4b4f82011-06-17 00:42:53 +0000127 shaderType, shaderSpec, compileOptions, true,
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000128 sourcePath, infoSink);
shannon.woods%transgaming.com@gtempaccount.comcbb6b6a2013-04-13 03:27:47 +0000129 parseContext.fragmentPrecisionHigh = fragmentPrecisionHigh;
alokp@chromium.org07620a52010-09-23 17:53:56 +0000130 GlobalParseContext = &parseContext;
alokp@chromium.org07620a52010-09-23 17:53:56 +0000131
132 // We preserve symbols at the built-in level from compile-to-compile.
133 // Start pushing the user-defined symbols at global level.
134 symbolTable.push();
Jamie Madill075edd82013-07-08 13:30:19 -0400135 if (!symbolTable.atGlobalLevel()) {
136 infoSink.info.prefix(EPrefixInternalError);
137 infoSink.info << "Wrong symbol table level";
138 }
alokp@chromium.org07620a52010-09-23 17:53:56 +0000139
140 // Parse shader.
141 bool success =
apatrick@chromium.org0f4cefe2011-01-26 19:30:57 +0000142 (PaParseStrings(numStrings - firstSource, &shaderStrings[firstSource], NULL, &parseContext) == 0) &&
alokp@chromium.org07620a52010-09-23 17:53:56 +0000143 (parseContext.treeRoot != NULL);
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +0000144
shannon.woods%transgaming.com@gtempaccount.com5524db02013-04-13 03:38:16 +0000145 shaderVersion = parseContext.getShaderVersion();
shannon.woods%transgaming.com@gtempaccount.com0bbed382013-04-13 03:38:07 +0000146
alokp@chromium.org07620a52010-09-23 17:53:56 +0000147 if (success) {
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000148 TIntermNode* root = parseContext.treeRoot;
149 success = intermediate.postProcess(root);
150
zmo@google.comb1762df2011-07-30 02:04:23 +0000151 if (success)
Jamie Madilleb1a0102013-07-08 13:31:38 -0400152 success = detectCallDepth(root, infoSink, (compileOptions & SH_LIMIT_CALL_STACK_DEPTH) != 0);
zmo@google.comb1762df2011-07-30 02:04:23 +0000153
Jamie Madill05a80ce2013-06-20 11:55:49 -0400154 if (success && shaderVersion == 300 && shaderType == SH_FRAGMENT_SHADER)
155 success = validateOutputs(root);
156
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000157 if (success && (compileOptions & SH_VALIDATE_LOOP_INDEXING))
158 success = validateLimitations(root);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000159
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000160 if (success && (compileOptions & SH_TIMING_RESTRICTIONS))
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000161 success = enforceTimingRestrictions(root, (compileOptions & SH_DEPENDENCY_GRAPH) != 0);
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000162
maxvujovic@gmail.com430f5e02012-06-08 17:47:59 +0000163 if (success && shaderSpec == SH_CSS_SHADERS_SPEC)
164 rewriteCSSShader(root);
165
zmo@google.com0c6bb7a2011-08-17 19:39:58 +0000166 // Unroll for-loop markup needs to happen after validateLimitations pass.
167 if (success && (compileOptions & SH_UNROLL_FOR_LOOP_WITH_INTEGER_INDEX))
168 ForLoopUnroll::MarkForLoopsWithIntegerIndicesForUnrolling(root);
169
zmo@google.com32e97312011-08-24 01:03:11 +0000170 // Built-in function emulation needs to happen after validateLimitations pass.
171 if (success && (compileOptions & SH_EMULATE_BUILT_IN_FUNCTIONS))
172 builtInFunctionEmulator.MarkBuiltInFunctionsForEmulation(root);
173
daniel@transgaming.com4167cc92013-01-11 04:11:53 +0000174 // Clamping uniform array bounds needs to happen after validateLimitations pass.
175 if (success && (compileOptions & SH_CLAMP_INDIRECT_ARRAY_BOUNDS))
176 arrayBoundsClamper.MarkIndirectArrayBoundsForClamping(root);
177
Jamie Madilleb1a0102013-07-08 13:31:38 -0400178 // Disallow expressions deemed too complex.
179 if (success && (compileOptions & SH_LIMIT_EXPRESSION_COMPLEXITY))
180 success = limitExpressionComplexity(root);
181
zmo@google.comfd747b82011-04-23 01:30:07 +0000182 // Call mapLongVariableNames() before collectAttribsUniforms() so in
183 // collectAttribsUniforms() we already have the mapped symbol names and
184 // we could composite mapped and original variable names.
daniel@transgaming.com0aa3b5a2012-11-28 19:43:24 +0000185 // Also, if we hash all the names, then no need to do this for long names.
186 if (success && (compileOptions & SH_MAP_LONG_VARIABLE_NAMES) && hashFunction == NULL)
zmo@google.comfd747b82011-04-23 01:30:07 +0000187 mapLongVariableNames(root);
188
gman@chromium.org8d804792012-10-17 21:33:48 +0000189 if (success && (compileOptions & SH_ATTRIBUTES_UNIFORMS)) {
zmo@google.comfd747b82011-04-23 01:30:07 +0000190 collectAttribsUniforms(root);
gman@chromium.org8d804792012-10-17 21:33:48 +0000191 if (compileOptions & SH_ENFORCE_PACKING_RESTRICTIONS) {
192 success = enforcePackingRestrictions();
193 if (!success) {
Jamie Madill075edd82013-07-08 13:30:19 -0400194 infoSink.info.prefix(EPrefixError);
195 infoSink.info << "too many uniforms";
gman@chromium.org8d804792012-10-17 21:33:48 +0000196 }
197 }
198 }
zmo@google.comfd747b82011-04-23 01:30:07 +0000199
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000200 if (success && (compileOptions & SH_INTERMEDIATE_TREE))
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000201 intermediate.outputTree(root);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000202
alokp@chromium.org4888ceb2010-10-01 21:13:12 +0000203 if (success && (compileOptions & SH_OBJECT_CODE))
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000204 translate(root);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000205 }
206
207 // Cleanup memory.
208 intermediate.remove(parseContext.treeRoot);
209 // Ensure symbol table is returned to the built-in level,
210 // throwing away all but the built-ins.
211 while (!symbolTable.atBuiltInLevel())
212 symbolTable.pop();
alokp@chromium.org07620a52010-09-23 17:53:56 +0000213
214 return success;
215}
216
Nicolas Capens49a88872013-06-20 09:54:03 -0400217bool TCompiler::InitBuiltInSymbolTable(const ShBuiltInResources &resources)
alokp@chromium.org07620a52010-09-23 17:53:56 +0000218{
shannon.woods%transgaming.com@gtempaccount.com18b4c4b2013-04-13 03:31:40 +0000219 compileResources = resources;
shannonwoods@chromium.org2ac0be92013-05-30 00:02:27 +0000220
Nicolas Capens49a88872013-06-20 09:54:03 -0400221 assert(symbolTable.isEmpty());
222 symbolTable.push(); // COMMON_BUILTINS
223 symbolTable.push(); // ESSL1_BUILTINS
224 symbolTable.push(); // ESSL3_BUILTINS
shannonwoods@chromium.org2ac0be92013-05-30 00:02:27 +0000225
Nicolas Capens49a88872013-06-20 09:54:03 -0400226 TPublicType integer;
227 integer.type = EbtInt;
228 integer.primarySize = 1;
229 integer.secondarySize = 1;
230 integer.array = false;
231
232 TPublicType floatingPoint;
233 floatingPoint.type = EbtFloat;
234 floatingPoint.primarySize = 1;
235 floatingPoint.secondarySize = 1;
236 floatingPoint.array = false;
237
238 switch(shaderType)
239 {
240 case SH_FRAGMENT_SHADER:
241 symbolTable.setDefaultPrecision(integer, EbpMedium);
242 break;
243 case SH_VERTEX_SHADER:
244 symbolTable.setDefaultPrecision(integer, EbpHigh);
245 symbolTable.setDefaultPrecision(floatingPoint, EbpHigh);
246 break;
247 default: assert(false && "Language not supported");
248 }
249
Jamie Madill1b452142013-07-12 14:51:11 -0400250 InsertBuiltInFunctions(shaderType, shaderSpec, resources, symbolTable);
Nicolas Capens49a88872013-06-20 09:54:03 -0400251
252 IdentifyBuiltIns(shaderType, shaderSpec, resources, symbolTable);
253
254 return true;
alokp@chromium.org07620a52010-09-23 17:53:56 +0000255}
256
257void TCompiler::clearResults()
258{
daniel@transgaming.com4167cc92013-01-11 04:11:53 +0000259 arrayBoundsClamper.Cleanup();
alokp@chromium.org07620a52010-09-23 17:53:56 +0000260 infoSink.info.erase();
261 infoSink.obj.erase();
262 infoSink.debug.erase();
263
264 attribs.clear();
265 uniforms.clear();
zmo@google.coma3b4ab42011-09-16 00:53:26 +0000266
267 builtInFunctionEmulator.Cleanup();
daniel@transgaming.com0aa3b5a2012-11-28 19:43:24 +0000268
269 nameMap.clear();
alokp@chromium.org07620a52010-09-23 17:53:56 +0000270}
271
Jamie Madilleb1a0102013-07-08 13:31:38 -0400272bool TCompiler::detectCallDepth(TIntermNode* root, TInfoSink& infoSink, bool limitCallStackDepth)
zmo@google.comb1762df2011-07-30 02:04:23 +0000273{
Jamie Madilleb1a0102013-07-08 13:31:38 -0400274 DetectCallDepth detect(infoSink, limitCallStackDepth, maxCallStackDepth);
zmo@google.comb1762df2011-07-30 02:04:23 +0000275 root->traverse(&detect);
Jamie Madilleb1a0102013-07-08 13:31:38 -0400276 switch (detect.detectCallDepth()) {
277 case DetectCallDepth::kErrorNone:
zmo@google.comb1762df2011-07-30 02:04:23 +0000278 return true;
Jamie Madilleb1a0102013-07-08 13:31:38 -0400279 case DetectCallDepth::kErrorMissingMain:
Jamie Madill075edd82013-07-08 13:30:19 -0400280 infoSink.info.prefix(EPrefixError);
281 infoSink.info << "Missing main()";
zmo@google.comb1762df2011-07-30 02:04:23 +0000282 return false;
Jamie Madilleb1a0102013-07-08 13:31:38 -0400283 case DetectCallDepth::kErrorRecursion:
Jamie Madill075edd82013-07-08 13:30:19 -0400284 infoSink.info.prefix(EPrefixError);
285 infoSink.info << "Function recursion detected";
zmo@google.comb1762df2011-07-30 02:04:23 +0000286 return false;
Jamie Madilleb1a0102013-07-08 13:31:38 -0400287 case DetectCallDepth::kErrorMaxDepthExceeded:
288 infoSink.info.prefix(EPrefixError);
289 infoSink.info << "Function call stack too deep";
290 return false;
zmo@google.comb1762df2011-07-30 02:04:23 +0000291 default:
292 UNREACHABLE();
293 return false;
294 }
295}
296
Jamie Madill05a80ce2013-06-20 11:55:49 -0400297bool TCompiler::validateOutputs(TIntermNode* root)
298{
299 ValidateOutputs validateOutputs(infoSink.info, compileResources.MaxDrawBuffers);
300 root->traverse(&validateOutputs);
301 return (validateOutputs.numErrors() == 0);
302}
303
maxvujovic@gmail.com430f5e02012-06-08 17:47:59 +0000304void TCompiler::rewriteCSSShader(TIntermNode* root)
305{
306 RenameFunction renamer("main(", "css_main(");
307 root->traverse(&renamer);
308}
309
alokp@chromium.orgb59a7782010-11-24 18:38:33 +0000310bool TCompiler::validateLimitations(TIntermNode* root) {
311 ValidateLimitations validate(shaderType, infoSink.info);
312 root->traverse(&validate);
313 return validate.numErrors() == 0;
314}
315
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000316bool TCompiler::enforceTimingRestrictions(TIntermNode* root, bool outputGraph)
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000317{
318 if (shaderSpec != SH_WEBGL_SPEC) {
319 infoSink.info << "Timing restrictions must be enforced under the WebGL spec.";
320 return false;
321 }
322
323 if (shaderType == SH_FRAGMENT_SHADER) {
324 TDependencyGraph graph(root);
325
326 // Output any errors first.
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000327 bool success = enforceFragmentShaderTimingRestrictions(graph);
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000328
329 // Then, output the dependency graph.
330 if (outputGraph) {
331 TDependencyGraphOutput output(infoSink.info);
332 output.outputAllSpanningTrees(graph);
333 }
334
335 return success;
336 }
337 else {
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000338 return enforceVertexShaderTimingRestrictions(root);
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000339 }
340}
341
Jamie Madilleb1a0102013-07-08 13:31:38 -0400342bool TCompiler::limitExpressionComplexity(TIntermNode* root)
343{
344 TIntermTraverser traverser;
345 root->traverse(&traverser);
346 TDependencyGraph graph(root);
347
348 for (TFunctionCallVector::const_iterator iter = graph.beginUserDefinedFunctionCalls();
349 iter != graph.endUserDefinedFunctionCalls();
350 ++iter)
351 {
352 TGraphFunctionCall* samplerSymbol = *iter;
353 TDependencyGraphTraverser graphTraverser;
354 samplerSymbol->traverse(&graphTraverser);
355 }
356
357 if (traverser.getMaxDepth() > maxExpressionComplexity) {
358 infoSink.info << "Expression too complex.";
359 return false;
360 }
361 return true;
362}
363
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000364bool TCompiler::enforceFragmentShaderTimingRestrictions(const TDependencyGraph& graph)
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000365{
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000366 RestrictFragmentShaderTiming restrictor(infoSink.info);
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000367 restrictor.enforceRestrictions(graph);
368 return restrictor.numErrors() == 0;
369}
370
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000371bool TCompiler::enforceVertexShaderTimingRestrictions(TIntermNode* root)
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000372{
maxvujovic@gmail.com77222c92012-06-04 21:06:05 +0000373 RestrictVertexShaderTiming restrictor(infoSink.info);
maxvujovic@gmail.com66ebd012012-05-30 22:18:11 +0000374 restrictor.enforceRestrictions(root);
375 return restrictor.numErrors() == 0;
376}
377
alokp@chromium.org07620a52010-09-23 17:53:56 +0000378void TCompiler::collectAttribsUniforms(TIntermNode* root)
379{
daniel@transgaming.com0aa3b5a2012-11-28 19:43:24 +0000380 CollectAttribsUniforms collect(attribs, uniforms, hashFunction);
alokp@chromium.org07620a52010-09-23 17:53:56 +0000381 root->traverse(&collect);
382}
zmo@google.comfd747b82011-04-23 01:30:07 +0000383
gman@chromium.org8d804792012-10-17 21:33:48 +0000384bool TCompiler::enforcePackingRestrictions()
385{
386 VariablePacker packer;
387 return packer.CheckVariablesWithinPackingLimits(maxUniformVectors, uniforms);
388}
389
zmo@google.comfd747b82011-04-23 01:30:07 +0000390void TCompiler::mapLongVariableNames(TIntermNode* root)
391{
zmo@google.comb9f64aa2012-01-20 00:35:15 +0000392 ASSERT(longNameMap);
393 MapLongVariableNames map(longNameMap);
zmo@google.com9996b8e2012-01-19 01:43:55 +0000394 root->traverse(&map);
zmo@google.comfd747b82011-04-23 01:30:07 +0000395}
396
397int TCompiler::getMappedNameMaxLength() const
398{
kbr@chromium.org22152112011-10-26 01:18:28 +0000399 return MAX_SHORTENED_IDENTIFIER_SIZE + 1;
zmo@google.comfd747b82011-04-23 01:30:07 +0000400}
zmo@google.com5601ea02011-06-10 18:23:25 +0000401
402const TExtensionBehavior& TCompiler::getExtensionBehavior() const
403{
404 return extensionBehavior;
405}
zmo@google.com32e97312011-08-24 01:03:11 +0000406
shannon.woods%transgaming.com@gtempaccount.com18b4c4b2013-04-13 03:31:40 +0000407const ShBuiltInResources& TCompiler::getResources() const
408{
409 return compileResources;
410}
411
daniel@transgaming.com4167cc92013-01-11 04:11:53 +0000412const ArrayBoundsClamper& TCompiler::getArrayBoundsClamper() const
413{
414 return arrayBoundsClamper;
415}
416
shannon.woods@transgaming.com1d432bb2013-01-25 21:57:28 +0000417ShArrayIndexClampingStrategy TCompiler::getArrayIndexClampingStrategy() const
418{
419 return clampingStrategy;
420}
421
422const BuiltInFunctionEmulator& TCompiler::getBuiltInFunctionEmulator() const
423{
424 return builtInFunctionEmulator;
425}