Home | History | Annotate | Download | only in compiler
      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_