1// Copyright 2016 The SwiftShader Authors. All Rights Reserved.
2//
3// Licensed under the Apache License, Version 2.0 (the "License");
4// you may not use this file except in compliance with the License.
5// You may obtain a copy of the License at
6//
7// http://www.apache.org/licenses/LICENSE-2.0
8//
9// Unless required by applicable law or agreed to in writing, software
10// distributed under the License is distributed on an "AS IS" BASIS,
11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12// See the License for the specific language governing permissions and
13// limitations under the License.
14
15#include "Compiler.h"
16#include "intermediate.h"
17
18class TInfoSinkBase;
19
20struct TLoopInfo {
21 struct TIndex {
22 int id; // symbol id.
23 } index;
24 TIntermLoop* loop;
25};
26typedef TVector<TLoopInfo> TLoopStack;
27
28// Traverses intermediate tree to ensure that the shader does not exceed the
29// minimum functionality mandated in GLSL 1.0 spec, Appendix A.
30class ValidateLimitations : public TIntermTraverser {
31public:
32 ValidateLimitations(GLenum shaderType, TInfoSinkBase& sink);
33
34 int numErrors() const { return mNumErrors; }
35
36 virtual bool visitBinary(Visit, TIntermBinary*);
37 virtual bool visitUnary(Visit, TIntermUnary*);
38 virtual bool visitAggregate(Visit, TIntermAggregate*);
39 virtual bool visitLoop(Visit, TIntermLoop*);
40
41private:
42 void error(TSourceLoc loc, const char *reason, const char* token);
43
44 bool withinLoopBody() const;
45 bool isLoopIndex(const TIntermSymbol* symbol) const;
46 bool validateLoopType(TIntermLoop* node);
47 bool validateForLoopHeader(TIntermLoop* node, TLoopInfo* info);
48 bool validateForLoopInit(TIntermLoop* node, TLoopInfo* info);
49 bool validateForLoopCond(TIntermLoop* node, TLoopInfo* info);
50 bool validateForLoopExpr(TIntermLoop* node, TLoopInfo* info);
51 // Returns true if none of the loop indices is used as the argument to
52 // the given function out or inout parameter.
53 bool validateFunctionCall(TIntermAggregate* node);
54 bool validateOperation(TIntermOperator* node, TIntermNode* operand);
55
56 // Returns true if indexing does not exceed the minimum functionality
57 // mandated in GLSL 1.0 spec, Appendix A, Section 5.
58 bool isConstExpr(TIntermNode* node);
59 bool isConstIndexExpr(TIntermNode* node);
60 bool validateIndexing(TIntermBinary* node);
61
62 GLenum mShaderType;
63 TInfoSinkBase& mSink;
64 int mNumErrors;
65 TLoopStack mLoopStack;
66};
67
68