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