Home | History | Annotate | Download | only in compiler
      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 EXT_draw_buffers;
     61 
     62 	unsigned int MaxCallStackDepth;
     63 };
     64 
     65 typedef unsigned int GLenum;
     66 #define GL_FRAGMENT_SHADER                0x8B30
     67 #define GL_VERTEX_SHADER                  0x8B31
     68 
     69 //
     70 // The base class for the machine dependent compiler to derive from
     71 // for managing object code from the compile.
     72 //
     73 class TCompiler
     74 {
     75 public:
     76 	TCompiler(GLenum shaderType);
     77 	virtual ~TCompiler();
     78 	virtual TCompiler* getAsCompiler() { return this; }
     79 
     80 	bool Init(const ShBuiltInResources& resources);
     81 	bool compile(const char* const shaderStrings[],
     82 	             const int numStrings,
     83 	             int compileOptions);
     84 
     85 	// Get results of the last compilation.
     86 	int getShaderVersion() const { return shaderVersion; }
     87 	TInfoSink& getInfoSink() { return infoSink; }
     88 
     89 protected:
     90 	GLenum getShaderType() const { return shaderType; }
     91 	// Initialize symbol-table with built-in symbols.
     92 	bool InitBuiltInSymbolTable(const ShBuiltInResources& resources);
     93 	// Clears the results from the previous compilation.
     94 	void clearResults();
     95 	// Return true if function recursion is detected or call depth exceeded.
     96 	bool validateCallDepth(TIntermNode *root, TInfoSink &infoSink);
     97 	// Returns true if the given shader does not exceed the minimum
     98 	// functionality mandated in GLSL 1.0 spec Appendix A.
     99 	bool validateLimitations(TIntermNode *root);
    100 	// Translate to object code.
    101 	virtual bool translate(TIntermNode *root) = 0;
    102 	// Get built-in extensions with default behavior.
    103 	const TExtensionBehavior& getExtensionBehavior() const;
    104 
    105 private:
    106 	GLenum shaderType;
    107 
    108 	unsigned int maxCallStackDepth;
    109 
    110 	// Built-in symbol table for the given language, spec, and resources.
    111 	// It is preserved from compile-to-compile.
    112 	TSymbolTable symbolTable;
    113 	// Built-in extensions with default behavior.
    114 	TExtensionBehavior extensionBehavior;
    115 
    116 	// Results of compilation.
    117 	int shaderVersion;
    118 	TInfoSink infoSink;  // Output sink.
    119 
    120 	// Memory allocator. Allocates and tracks memory required by the compiler.
    121 	// Deallocates all memory when compiler is destructed.
    122 	TPoolAllocator allocator;
    123 };
    124 
    125 bool InitCompilerGlobals();
    126 void FreeCompilerGlobals();
    127 
    128 #endif // _COMPILER_INCLUDED_
    129