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(); |
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. |
88 | int getShaderVersion() const { return shaderVersion; } |
89 | TInfoSink& getInfoSink() { return infoSink; } |
90 | |
91 | protected: |
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 | |