Home | History | Annotate | Download | only in libGLESv2
      1 //
      2 // Copyright (c) 2002-2013 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 // Shader.h: Defines the abstract gl::Shader class and its concrete derived
      8 // classes VertexShader and FragmentShader. Implements GL shader objects and
      9 // related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section
     10 // 3.8 page 84.
     11 
     12 #ifndef LIBGLESV2_SHADER_H_
     13 #define LIBGLESV2_SHADER_H_
     14 
     15 #include <GLES3/gl3.h>
     16 #include <GLES2/gl2.h>
     17 #include <string>
     18 #include <list>
     19 #include <vector>
     20 
     21 #include "common/shadervars.h"
     22 #include "common/angleutils.h"
     23 #include "libGLESv2/angletypes.h"
     24 #include "GLSLANG/ShaderLang.h"
     25 
     26 namespace rx
     27 {
     28 class Renderer;
     29 }
     30 
     31 namespace gl
     32 {
     33 class ResourceManager;
     34 
     35 struct PackedVarying : public Varying
     36 {
     37     unsigned int registerIndex; // Assigned during link
     38 
     39     PackedVarying(const Varying &varying)
     40       : Varying(varying),
     41         registerIndex(GL_INVALID_INDEX)
     42     {}
     43 
     44     bool registerAssigned() const { return registerIndex != GL_INVALID_INDEX; }
     45 
     46     void resetRegisterAssignment()
     47     {
     48         registerIndex = GL_INVALID_INDEX;
     49     }
     50 };
     51 
     52 class Shader
     53 {
     54     friend class DynamicHLSL;
     55 
     56   public:
     57     Shader(ResourceManager *manager, const rx::Renderer *renderer, GLuint handle);
     58 
     59     virtual ~Shader();
     60 
     61     virtual GLenum getType() = 0;
     62     GLuint getHandle() const;
     63 
     64     void deleteSource();
     65     void setSource(GLsizei count, const char *const *string, const GLint *length);
     66     int getInfoLogLength() const;
     67     void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const;
     68     int getSourceLength() const;
     69     void getSource(GLsizei bufSize, GLsizei *length, char *buffer) const;
     70     int getTranslatedSourceLength() const;
     71     void getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer) const;
     72     const std::vector<Uniform> &getUniforms() const;
     73     const std::vector<InterfaceBlock> &getInterfaceBlocks() const;
     74     std::vector<PackedVarying> &getVaryings();
     75 
     76     virtual void compile() = 0;
     77     virtual void uncompile();
     78     bool isCompiled() const;
     79     const std::string &getHLSL() const;
     80 
     81     void addRef();
     82     void release();
     83     unsigned int getRefCount() const;
     84     bool isFlaggedForDeletion() const;
     85     void flagForDeletion();
     86     int getShaderVersion() const;
     87     void resetVaryingsRegisterAssignment();
     88 
     89     static void releaseCompiler();
     90     static ShShaderOutput getCompilerOutputType(GLenum shader);
     91 
     92     bool usesDepthRange() const { return mUsesDepthRange; }
     93     bool usesPointSize() const { return mUsesPointSize; }
     94     rx::D3DWorkaroundType getD3DWorkarounds() const;
     95 
     96   protected:
     97     void parseVaryings(void *compiler);
     98 
     99     void compileToHLSL(void *compiler);
    100 
    101     void getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer) const;
    102 
    103     static bool compareVarying(const PackedVarying &x, const PackedVarying &y);
    104 
    105     const rx::Renderer *const mRenderer;
    106 
    107     std::vector<PackedVarying> mVaryings;
    108 
    109     bool mUsesMultipleRenderTargets;
    110     bool mUsesFragColor;
    111     bool mUsesFragData;
    112     bool mUsesFragCoord;
    113     bool mUsesFrontFacing;
    114     bool mUsesPointSize;
    115     bool mUsesPointCoord;
    116     bool mUsesDepthRange;
    117     bool mUsesFragDepth;
    118     int mShaderVersion;
    119     bool mUsesDiscardRewriting;
    120     bool mUsesNestedBreak;
    121 
    122     static void *mFragmentCompiler;
    123     static void *mVertexCompiler;
    124 
    125   private:
    126     DISALLOW_COPY_AND_ASSIGN(Shader);
    127 
    128     void initializeCompiler();
    129 
    130     const GLuint mHandle;
    131     unsigned int mRefCount;     // Number of program objects this shader is attached to
    132     bool mDeleteStatus;         // Flag to indicate that the shader can be deleted when no longer in use
    133 
    134     std::string mSource;
    135     std::string mHlsl;
    136     std::string mInfoLog;
    137     std::vector<Uniform> mActiveUniforms;
    138     std::vector<InterfaceBlock> mActiveInterfaceBlocks;
    139 
    140     ResourceManager *mResourceManager;
    141 };
    142 
    143 class VertexShader : public Shader
    144 {
    145     friend class DynamicHLSL;
    146 
    147   public:
    148     VertexShader(ResourceManager *manager, const rx::Renderer *renderer, GLuint handle);
    149 
    150     ~VertexShader();
    151 
    152     virtual GLenum getType();
    153     virtual void compile();
    154     virtual void uncompile();
    155     int getSemanticIndex(const std::string &attributeName);
    156 
    157     const std::vector<Attribute> &activeAttributes() const { return mActiveAttributes; }
    158 
    159   private:
    160     DISALLOW_COPY_AND_ASSIGN(VertexShader);
    161 
    162     void parseAttributes();
    163 
    164     std::vector<Attribute> mActiveAttributes;
    165 };
    166 
    167 class FragmentShader : public Shader
    168 {
    169   public:
    170     FragmentShader(ResourceManager *manager,const rx::Renderer *renderer, GLuint handle);
    171 
    172     ~FragmentShader();
    173 
    174     virtual GLenum getType();
    175     virtual void compile();
    176     virtual void uncompile();
    177     const std::vector<Attribute> &getOutputVariables() const;
    178 
    179   private:
    180     DISALLOW_COPY_AND_ASSIGN(FragmentShader);
    181 
    182     std::vector<Attribute> mActiveOutputVariables;
    183 };
    184 }
    185 
    186 #endif   // LIBGLESV2_SHADER_H_
    187