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.
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
12 #ifndef LIBGLESV2_SHADER_H_
13 #define LIBGLESV2_SHADER_H_
21 #include <GLSLANG/ShaderLang.h>
23 #include "common/angleutils.h"
24 #include "libGLESv2/angletypes.h"
33 class ResourceManager;
35 struct PackedVarying : public sh::Varying
37 unsigned int registerIndex; // Assigned during link
38 unsigned int columnIndex; // Assigned during link, defaults to 0
40 PackedVarying(const sh::Varying &varying)
41 : sh::Varying(varying),
42 registerIndex(GL_INVALID_INDEX),
46 bool registerAssigned() const { return registerIndex != GL_INVALID_INDEX; }
47 bool isBuiltIn() const { return name.compare(0, 3, "gl_") == 0; }
49 void resetRegisterAssignment()
51 registerIndex = GL_INVALID_INDEX;
58 Shader(ResourceManager *manager, rx::ShaderImpl *impl, GLenum type, GLuint handle);
62 GLenum getType() const { return mType; }
63 GLuint getHandle() const;
65 rx::ShaderImpl *getImplementation() { return mShader; }
66 const rx::ShaderImpl *getImplementation() const { return mShader; }
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 void getTranslatedSourceWithDebugInfo(GLsizei bufSize, GLsizei *length, char *buffer) const;
79 bool isCompiled() const { return mCompiled; }
83 unsigned int getRefCount() const;
84 bool isFlaggedForDeletion() const;
85 void flagForDeletion();
87 const std::vector<gl::PackedVarying> &getVaryings() const;
88 const std::vector<sh::Uniform> &getUniforms() const;
89 const std::vector<sh::InterfaceBlock> &getInterfaceBlocks() const;
90 const std::vector<sh::Attribute> &getActiveAttributes() const;
91 const std::vector<sh::Attribute> &getActiveOutputVariables() const;
93 std::vector<gl::PackedVarying> &getVaryings();
94 std::vector<sh::Uniform> &getUniforms();
95 std::vector<sh::InterfaceBlock> &getInterfaceBlocks();
96 std::vector<sh::Attribute> &getActiveAttributes();
97 std::vector<sh::Attribute> &getActiveOutputVariables();
100 DISALLOW_COPY_AND_ASSIGN(Shader);
102 static void getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer);
104 rx::ShaderImpl *mShader;
105 const GLuint mHandle;
108 unsigned int mRefCount; // Number of program objects this shader is attached to
109 bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use
110 bool mCompiled; // Indicates if this shader has been successfully compiled
112 ResourceManager *mResourceManager;
117 #endif // LIBGLESV2_SHADER_H_