1b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org// 2b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org// Copyright (c) 2010 The ANGLE Project Authors. All rights reserved. 3b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org// Use of this source code is governed by a BSD-style license that can be 4b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org// found in the LICENSE file. 5b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org// 6b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org 7b1a85f48a6cb63c32e884a9dea86b1ca7275bf7cJamie Madill#include "compiler/translator/IntermNode.h" 8550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo#include "compiler/translator/LoopInfo.h" 9b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org 10b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.orgclass TInfoSinkBase; 11b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org 12b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org// Traverses intermediate tree to ensure that the shader does not exceed the 13b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org// minimum functionality mandated in GLSL 1.0 spec, Appendix A. 14550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Moclass ValidateLimitations : public TIntermTraverser 15550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo{ 16550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo public: 17183bde5527317fa2208401e5e6b803ef51a0fdcbJamie Madill ValidateLimitations(sh::GLenum shaderType, TInfoSinkBase &sink); 18b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org 19b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org int numErrors() const { return mNumErrors; } 20b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org 21550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo virtual bool visitBinary(Visit, TIntermBinary *); 22550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo virtual bool visitUnary(Visit, TIntermUnary *); 23550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo virtual bool visitAggregate(Visit, TIntermAggregate *); 24550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo virtual bool visitLoop(Visit, TIntermLoop *); 25b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org 26550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo private: 27550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo void error(TSourceLoc loc, const char *reason, const char *token); 28b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org 29b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org bool withinLoopBody() const; 30550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo bool isLoopIndex(TIntermSymbol *symbol); 31550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo bool validateLoopType(TIntermLoop *node); 32550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo 33550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo bool validateForLoopHeader(TIntermLoop *node); 34550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo // If valid, return the index symbol id; Otherwise, return -1. 35550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo int validateForLoopInit(TIntermLoop *node); 36550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo bool validateForLoopCond(TIntermLoop *node, int indexSymbolId); 37550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo bool validateForLoopExpr(TIntermLoop *node, int indexSymbolId); 38550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo 39b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org // Returns true if none of the loop indices is used as the argument to 40b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org // the given function out or inout parameter. 41550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo bool validateFunctionCall(TIntermAggregate *node); 42550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo bool validateOperation(TIntermOperator *node, TIntermNode *operand); 43b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org 44b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org // Returns true if indexing does not exceed the minimum functionality 45b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org // mandated in GLSL 1.0 spec, Appendix A, Section 5. 46550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo bool isConstExpr(TIntermNode *node); 47550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo bool isConstIndexExpr(TIntermNode *node); 48550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo bool validateIndexing(TIntermBinary *node); 49b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org 50183bde5527317fa2208401e5e6b803ef51a0fdcbJamie Madill sh::GLenum mShaderType; 51550c600b99d7ee2463e5878d0a9f66ea24c1414aZhenyao Mo TInfoSinkBase &mSink; 52b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org int mNumErrors; 53b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org TLoopStack mLoopStack; 54b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org}; 55b59a778cfe7e36dca41c2cc44198da511f447be8alokp@chromium.org 56