Home | History | Annotate | Download | only in compiler
      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 };
     17 typedef TVector<TLoopInfo> TLoopStack;
     18 
     19 // Traverses intermediate tree to ensure that the shader does not exceed the
     20 // minimum functionality mandated in GLSL 1.0 spec, Appendix A.
     21 class ValidateLimitations : public TIntermTraverser {
     22 public:
     23     ValidateLimitations(ShShaderType shaderType, TInfoSinkBase& sink);
     24 
     25     int numErrors() const { return mNumErrors; }
     26 
     27     virtual void visitSymbol(TIntermSymbol*);
     28     virtual void visitConstantUnion(TIntermConstantUnion*);
     29     virtual bool visitBinary(Visit, TIntermBinary*);
     30     virtual bool visitUnary(Visit, TIntermUnary*);
     31     virtual bool visitSelection(Visit, TIntermSelection*);
     32     virtual bool visitAggregate(Visit, TIntermAggregate*);
     33     virtual bool visitLoop(Visit, TIntermLoop*);
     34     virtual bool visitBranch(Visit, TIntermBranch*);
     35 
     36 private:
     37     void error(TSourceLoc loc, const char *reason, const char* token);
     38 
     39     bool withinLoopBody() const;
     40     bool isLoopIndex(const TIntermSymbol* symbol) const;
     41     bool validateLoopType(TIntermLoop* node);
     42     bool validateForLoopHeader(TIntermLoop* node, TLoopInfo* info);
     43     bool validateForLoopInit(TIntermLoop* node, TLoopInfo* info);
     44     bool validateForLoopCond(TIntermLoop* node, TLoopInfo* info);
     45     bool validateForLoopExpr(TIntermLoop* node, TLoopInfo* info);
     46     // Returns true if none of the loop indices is used as the argument to
     47     // the given function out or inout parameter.
     48     bool validateFunctionCall(TIntermAggregate* node);
     49     bool validateOperation(TIntermOperator* node, TIntermNode* operand);
     50 
     51     // Returns true if indexing does not exceed the minimum functionality
     52     // mandated in GLSL 1.0 spec, Appendix A, Section 5.
     53     bool isConstExpr(TIntermNode* node);
     54     bool isConstIndexExpr(TIntermNode* node);
     55     bool validateIndexing(TIntermBinary* node);
     56 
     57     ShShaderType mShaderType;
     58     TInfoSinkBase& mSink;
     59     int mNumErrors;
     60     TLoopStack mLoopStack;
     61 };
     62 
     63