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 
18 class TInfoSinkBase;
19 
20 struct TLoopInfo {
21 	struct TIndex {
22 		int id;  // symbol id.
23 	} index;
24 	TIntermLoop* loop;
25 };
26 typedef 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.
30 class ValidateLimitations : public TIntermTraverser {
31 public:
32 	ValidateLimitations(GLenum shaderType, TInfoSinkBase& sink);
33 
numErrors()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 
41 private:
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