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