1 // 2 // Copyright (c) 2010 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 #include "GLSLANG/ShaderLang.h" 8 #include "compiler/intermediate.h" 9 10 class TInfoSinkBase; 11 12 struct TLoopInfo { 13 struct TIndex { 14 int id; // symbol id. 15 } index; 16 TIntermLoop* loop; 17 }; 18 typedef TVector<TLoopInfo> TLoopStack; 19 20 // Traverses intermediate tree to ensure that the shader does not exceed the 21 // minimum functionality mandated in GLSL 1.0 spec, Appendix A. 22 class ValidateLimitations : public TIntermTraverser { 23 public: 24 ValidateLimitations(ShShaderType shaderType, TInfoSinkBase& sink); 25 26 int numErrors() const { return mNumErrors; } 27 28 virtual bool visitBinary(Visit, TIntermBinary*); 29 virtual bool visitUnary(Visit, TIntermUnary*); 30 virtual bool visitAggregate(Visit, TIntermAggregate*); 31 virtual bool visitLoop(Visit, TIntermLoop*); 32 33 private: 34 void error(TSourceLoc loc, const char *reason, const char* token); 35 36 bool withinLoopBody() const; 37 bool isLoopIndex(const TIntermSymbol* symbol) const; 38 bool validateLoopType(TIntermLoop* node); 39 bool validateForLoopHeader(TIntermLoop* node, TLoopInfo* info); 40 bool validateForLoopInit(TIntermLoop* node, TLoopInfo* info); 41 bool validateForLoopCond(TIntermLoop* node, TLoopInfo* info); 42 bool validateForLoopExpr(TIntermLoop* node, TLoopInfo* info); 43 // Returns true if none of the loop indices is used as the argument to 44 // the given function out or inout parameter. 45 bool validateFunctionCall(TIntermAggregate* node); 46 bool validateOperation(TIntermOperator* node, TIntermNode* operand); 47 48 // Returns true if indexing does not exceed the minimum functionality 49 // mandated in GLSL 1.0 spec, Appendix A, Section 5. 50 bool isConstExpr(TIntermNode* node); 51 bool isConstIndexExpr(TIntermNode* node); 52 bool validateIndexing(TIntermBinary* node); 53 54 ShShaderType mShaderType; 55 TInfoSinkBase& mSink; 56 int mNumErrors; 57 TLoopStack mLoopStack; 58 }; 59 60