1 // 2 // Copyright (c) 2002-2010 The ANGLE Project Authors. All rights reserved. 3 // Use of this source code is governed by a BSD-style license that can be 4 // found in the LICENSE file. 5 // 6 7 #ifndef _SHHANDLE_INCLUDED_ 8 #define _SHHANDLE_INCLUDED_ 9 10 // 11 // Machine independent part of the compiler private objects 12 // sent as ShHandle to the driver. 13 // 14 // This should not be included by driver code. 15 // 16 17 #include "GLSLANG/ShaderLang.h" 18 19 #include "compiler/ExtensionBehavior.h" 20 #include "compiler/InfoSink.h" 21 #include "compiler/SymbolTable.h" 22 #include "compiler/VariableInfo.h" 23 24 class TCompiler; 25 26 // 27 // The base class used to back handles returned to the driver. 28 // 29 class TShHandleBase { 30 public: 31 TShHandleBase(); 32 virtual ~TShHandleBase(); 33 virtual TCompiler* getAsCompiler() { return 0; } 34 35 protected: 36 // Memory allocator. Allocates and tracks memory required by the compiler. 37 // Deallocates all memory when compiler is destructed. 38 TPoolAllocator allocator; 39 }; 40 41 // 42 // The base class for the machine dependent compiler to derive from 43 // for managing object code from the compile. 44 // 45 class TCompiler : public TShHandleBase { 46 public: 47 TCompiler(ShShaderType type, ShShaderSpec spec); 48 virtual ~TCompiler(); 49 virtual TCompiler* getAsCompiler() { return this; } 50 51 bool Init(const ShBuiltInResources& resources); 52 bool compile(const char* const shaderStrings[], 53 const int numStrings, 54 int compileOptions); 55 56 // Get results of the last compilation. 57 TInfoSink& getInfoSink() { return infoSink; } 58 const TVariableInfoList& getAttribs() const { return attribs; } 59 const TVariableInfoList& getUniforms() const { return uniforms; } 60 61 protected: 62 ShShaderType getShaderType() const { return shaderType; } 63 ShShaderSpec getShaderSpec() const { return shaderSpec; } 64 // Initialize symbol-table with built-in symbols. 65 bool InitBuiltInSymbolTable(const ShBuiltInResources& resources); 66 // Clears the results from the previous compilation. 67 void clearResults(); 68 // Returns true if the given shader does not exceed the minimum 69 // functionality mandated in GLSL 1.0 spec Appendix A. 70 bool validateLimitations(TIntermNode* root); 71 // Collect info for all attribs and uniforms. 72 void collectAttribsUniforms(TIntermNode* root); 73 // Translate to object code. 74 virtual void translate(TIntermNode* root) = 0; 75 76 private: 77 ShShaderType shaderType; 78 ShShaderSpec shaderSpec; 79 80 // Built-in symbol table for the given language, spec, and resources. 81 // It is preserved from compile-to-compile. 82 TSymbolTable symbolTable; 83 // Built-in extensions with default behavior. 84 TExtensionBehavior extensionBehavior; 85 86 // Results of compilation. 87 TInfoSink infoSink; // Output sink. 88 TVariableInfoList attribs; // Active attributes in the compiled shader. 89 TVariableInfoList uniforms; // Active uniforms in the compiled shader. 90 }; 91 92 // 93 // This is the interface between the machine independent code 94 // and the machine dependent code. 95 // 96 // The machine dependent code should derive from the classes 97 // above. Then Construct*() and Delete*() will create and 98 // destroy the machine dependent objects, which contain the 99 // above machine independent information. 100 // 101 TCompiler* ConstructCompiler(ShShaderType type, ShShaderSpec spec); 102 void DeleteCompiler(TCompiler*); 103 104 #endif // _SHHANDLE_INCLUDED_