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     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