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 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