// // Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. // // Shader.h: Defines the abstract gl::Shader class and its concrete derived // classes VertexShader and FragmentShader. Implements GL shader objects and // related functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section // 3.8 page 84. #ifndef LIBANGLE_SHADER_H_ #define LIBANGLE_SHADER_H_ #include #include #include #include "angle_gl.h" #include #include "common/angleutils.h" #include "libANGLE/angletypes.h" namespace rx { class ShaderImpl; } namespace gl { class Compiler; class ResourceManager; struct Data; struct PackedVarying : public sh::Varying { unsigned int registerIndex; // Assigned during link unsigned int columnIndex; // Assigned during link, defaults to 0 PackedVarying(const sh::Varying &varying) : sh::Varying(varying), registerIndex(GL_INVALID_INDEX), columnIndex(0) {} bool registerAssigned() const { return registerIndex != GL_INVALID_INDEX; } bool isBuiltIn() const { return name.compare(0, 3, "gl_") == 0; } void resetRegisterAssignment() { registerIndex = GL_INVALID_INDEX; } }; class Shader : angle::NonCopyable { public: Shader(ResourceManager *manager, rx::ShaderImpl *impl, GLenum type, GLuint handle); virtual ~Shader(); GLenum getType() const { return mType; } GLuint getHandle() const; rx::ShaderImpl *getImplementation() { return mShader; } const rx::ShaderImpl *getImplementation() const { return mShader; } void deleteSource(); void setSource(GLsizei count, const char *const *string, const GLint *length); int getInfoLogLength() const; void getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const; int getSourceLength() const; void getSource(GLsizei bufSize, GLsizei *length, char *buffer) const; int getTranslatedSourceLength() const; void getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer) const; void getTranslatedSourceWithDebugInfo(GLsizei bufSize, GLsizei *length, char *buffer) const; void compile(Compiler *compiler); bool isCompiled() const { return mCompiled; } void addRef(); void release(); unsigned int getRefCount() const; bool isFlaggedForDeletion() const; void flagForDeletion(); const std::vector &getVaryings() const; const std::vector &getUniforms() const; const std::vector &getInterfaceBlocks() const; const std::vector &getActiveAttributes() const; const std::vector &getActiveOutputVariables() const; std::vector &getVaryings(); std::vector &getUniforms(); std::vector &getInterfaceBlocks(); std::vector &getActiveAttributes(); std::vector &getActiveOutputVariables(); int getSemanticIndex(const std::string &attributeName) const; private: static void getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer); rx::ShaderImpl *mShader; const GLuint mHandle; const GLenum mType; std::string mSource; unsigned int mRefCount; // Number of program objects this shader is attached to bool mDeleteStatus; // Flag to indicate that the shader can be deleted when no longer in use bool mCompiled; // Indicates if this shader has been successfully compiled ResourceManager *mResourceManager; }; } #endif // LIBANGLE_SHADER_H_