• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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 #ifndef _COMPILER_INCLUDED_
16 #define _COMPILER_INCLUDED_
17 
18 #include "ExtensionBehavior.h"
19 #include "InfoSink.h"
20 #include "SymbolTable.h"
21 
22 enum ShCompileOptions
23 {
24   SH_VALIDATE                = 0,
25   SH_VALIDATE_LOOP_INDEXING  = 0x0001,
26   SH_INTERMEDIATE_TREE       = 0x0002,
27   SH_OBJECT_CODE             = 0x0004,
28   SH_ATTRIBUTES_UNIFORMS     = 0x0008,
29   SH_LINE_DIRECTIVES         = 0x0010,
30   SH_SOURCE_PATH             = 0x0020
31 };
32 
33 //
34 // Implementation dependent built-in resources (constants and extensions).
35 // The names for these resources has been obtained by stripping gl_/GL_.
36 //
37 struct ShBuiltInResources
38 {
39 	ShBuiltInResources();
40 
41 	// Constants.
42 	int MaxVertexAttribs;
43 	int MaxVertexUniformVectors;
44 	int MaxVaryingVectors;
45 	int MaxVertexTextureImageUnits;
46 	int MaxCombinedTextureImageUnits;
47 	int MaxTextureImageUnits;
48 	int MaxFragmentUniformVectors;
49 	int MaxDrawBuffers;
50 	int MaxVertexOutputVectors;
51 	int MaxFragmentInputVectors;
52 	int MinProgramTexelOffset;
53 	int MaxProgramTexelOffset;
54 
55 	// Extensions.
56 	// Set to 1 to enable the extension, else 0.
57 	int OES_standard_derivatives;
58 	int OES_fragment_precision_high;
59 	int OES_EGL_image_external;
60 	int OES_EGL_image_external_essl3;
61 	int EXT_draw_buffers;
62 	int ARB_texture_rectangle;
63 
64 	unsigned int MaxCallStackDepth;
65 };
66 
67 typedef unsigned int GLenum;
68 #define GL_FRAGMENT_SHADER                0x8B30
69 #define GL_VERTEX_SHADER                  0x8B31
70 
71 //
72 // The base class for the machine dependent compiler to derive from
73 // for managing object code from the compile.
74 //
75 class TCompiler
76 {
77 public:
78 	TCompiler(GLenum shaderType);
79 	virtual ~TCompiler();
getAsCompiler()80 	virtual TCompiler* getAsCompiler() { return this; }
81 
82 	bool Init(const ShBuiltInResources& resources);
83 	bool compile(const char* const shaderStrings[],
84 	             const int numStrings,
85 	             int compileOptions);
86 
87 	// Get results of the last compilation.
getShaderVersion()88 	int getShaderVersion() const { return shaderVersion; }
getInfoSink()89 	TInfoSink& getInfoSink() { return infoSink; }
90 
91 protected:
getShaderType()92 	GLenum getShaderType() const { return shaderType; }
93 	// Initialize symbol-table with built-in symbols.
94 	bool InitBuiltInSymbolTable(const ShBuiltInResources& resources);
95 	// Clears the results from the previous compilation.
96 	void clearResults();
97 	// Return true if function recursion is detected or call depth exceeded.
98 	bool validateCallDepth(TIntermNode *root, TInfoSink &infoSink);
99 	// Returns true if the given shader does not exceed the minimum
100 	// functionality mandated in GLSL 1.0 spec Appendix A.
101 	bool validateLimitations(TIntermNode *root);
102 	// Translate to object code.
103 	virtual bool translate(TIntermNode *root) = 0;
104 	// Get built-in extensions with default behavior.
105 	const TExtensionBehavior& getExtensionBehavior() const;
106 
107 private:
108 	GLenum shaderType;
109 
110 	unsigned int maxCallStackDepth;
111 
112 	// Built-in symbol table for the given language, spec, and resources.
113 	// It is preserved from compile-to-compile.
114 	TSymbolTable symbolTable;
115 	// Built-in extensions with default behavior.
116 	TExtensionBehavior extensionBehavior;
117 
118 	// Results of compilation.
119 	int shaderVersion;
120 	TInfoSink infoSink;  // Output sink.
121 
122 	// Memory allocator. Allocates and tracks memory required by the compiler.
123 	// Deallocates all memory when compiler is destructed.
124 	TPoolAllocator allocator;
125 };
126 
127 bool InitCompilerGlobals();
128 void FreeCompilerGlobals();
129 
130 #endif // _COMPILER_INCLUDED_
131