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 
     16 #include <string>
     17 #include <list>
     18 #include <vector>
     19 
     20 #include "angle_gl.h"
     21 #include <GLSLANG/ShaderLang.h>
     22 
     23 #include "common/angleutils.h"
     24 #include "libGLESv2/angletypes.h"
     25 
     26 namespace rx
     27 {
     28 class ShaderImpl;
     29 }
     30 
     31 namespace gl
     32 {
     33 class ResourceManager;
     34 
     35 struct PackedVarying : public sh::Varying
     36 {
     37     unsigned int registerIndex; // Assigned during link
     38     unsigned int columnIndex; // Assigned during link, defaults to 0
     39 
     40     PackedVarying(const sh::Varying &varying)
     41       : sh::Varying(varying),
     42         registerIndex(GL_INVALID_INDEX),
     43         columnIndex(0)
     44     {}
     45 
     46     bool registerAssigned() const { return registerIndex != GL_INVALID_INDEX; }
     47     bool isBuiltIn() const { return name.compare(0, 3, "gl_") == 0; }
     48 
     49     void resetRegisterAssignment()
     50     {
     51         registerIndex = GL_INVALID_INDEX;
     52     }
     53 };
     54 
     55 class Shader
     56 {
     57   public:
     58     Shader(ResourceManager *manager, rx::ShaderImpl *impl, GLenum type, GLuint handle);
     59 
     60     virtual ~Shader();
     61 
     62     GLenum getType() const { return mType; }
     63     GLuint getHandle() const;
     64 
     65     rx::ShaderImpl *getImplementation() { return mShader; }
     66     const rx::ShaderImpl *getImplementation() const { return mShader; }
     67 
     68     void deleteSource();
     69     void setSource(GLsizei count, const char *const *string, const GLint *length);
     70     int getInfoLogLength() const;
     71     void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const;
     72     int getSourceLength() const;
     73     void getSource(GLsizei bufSize, GLsizei *length, char *buffer) const;
     74     int getTranslatedSourceLength() const;
     75     void getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer) const;
     76 
     77     void compile();
     78     bool isCompiled() const { return mCompiled; }
     79 
     80     void addRef();
     81     void release();
     82     unsigned int getRefCount() const;
     83     bool isFlaggedForDeletion() const;
     84     void flagForDeletion();
     85 
     86     const std::vector<gl::PackedVarying> &getVaryings() const;
     87     const std::vector<sh::Uniform> &getUniforms() const;
     88     const std::vector<sh::InterfaceBlock> &getInterfaceBlocks() const;
     89     const std::vector<sh::Attribute> &getActiveAttributes() const;
     90     const std::vector<sh::Attribute> &getActiveOutputVariables() const;
     91 
     92     std::vector<gl::PackedVarying> &getVaryings();
     93     std::vector<sh::Uniform> &getUniforms();
     94     std::vector<sh::InterfaceBlock> &getInterfaceBlocks();
     95     std::vector<sh::Attribute> &getActiveAttributes();
     96     std::vector<sh::Attribute> &getActiveOutputVariables();
     97 
     98   private:
     99     DISALLOW_COPY_AND_ASSIGN(Shader);
    100 
    101     static void getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer);
    102 
    103     rx::ShaderImpl *mShader;
    104     const GLuint mHandle;
    105     const GLenum mType;
    106     std::string mSource;
    107     unsigned int mRefCount;     // Number of program objects this shader is attached to
    108     bool mDeleteStatus;         // Flag to indicate that the shader can be deleted when no longer in use
    109     bool mCompiled;             // Indicates if this shader has been successfully compiled
    110 
    111     ResourceManager *mResourceManager;
    112 };
    113 
    114 }
    115 
    116 #endif   // LIBGLESV2_SHADER_H_
    117