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
22enum 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//
37struct 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
67typedef 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//
75class TCompiler
76{
77public:
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
91protected:
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
107private:
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
127bool InitCompilerGlobals();
128void FreeCompilerGlobals();
129
130#endif // _COMPILER_INCLUDED_
131