2 // Copyright (c) 2002-2014 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.cpp: Implements the gl::Shader class and its derived classes
8 // VertexShader and FragmentShader. Implements GL shader objects and related
9 // functionality. [OpenGL ES 2.0.24] section 2.10 page 24 and section 3.8 page 84.
11 #include "libGLESv2/Shader.h"
12 #include "libGLESv2/renderer/Renderer.h"
13 #include "libGLESv2/renderer/ShaderImpl.h"
14 #include "libGLESv2/Constants.h"
15 #include "libGLESv2/ResourceManager.h"
17 #include "common/utilities.h"
19 #include "GLSLANG/ShaderLang.h"
26 Shader::Shader(ResourceManager *manager, rx::ShaderImpl *impl, GLenum type, GLuint handle)
30 mResourceManager(manager),
42 GLuint Shader::getHandle() const
47 void Shader::setSource(GLsizei count, const char *const *string, const GLint *length)
49 std::ostringstream stream;
51 for (int i = 0; i < count; i++)
56 mSource = stream.str();
59 int Shader::getInfoLogLength() const
61 return mShader->getInfoLog().empty() ? 0 : (mShader->getInfoLog().length() + 1);
64 void Shader::getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const
70 index = std::min(bufSize - 1, static_cast<GLsizei>(mShader->getInfoLog().length()));
71 memcpy(infoLog, mShader->getInfoLog().c_str(), index);
73 infoLog[index] = '\0';
82 int Shader::getSourceLength() const
84 return mSource.empty() ? 0 : (mSource.length() + 1);
87 int Shader::getTranslatedSourceLength() const
89 return mShader->getTranslatedSource().empty() ? 0 : (mShader->getTranslatedSource().length() + 1);
92 void Shader::getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer)
98 index = std::min(bufSize - 1, static_cast<GLsizei>(source.length()));
99 memcpy(buffer, source.c_str(), index);
101 buffer[index] = '\0';
110 void Shader::getSource(GLsizei bufSize, GLsizei *length, char *buffer) const
112 getSourceImpl(mSource, bufSize, length, buffer);
115 void Shader::getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer) const
117 getSourceImpl(mShader->getTranslatedSource(), bufSize, length, buffer);
120 void Shader::compile()
122 mCompiled = mShader->compile(mSource);
125 void Shader::addRef()
130 void Shader::release()
134 if (mRefCount == 0 && mDeleteStatus)
136 mResourceManager->deleteShader(mHandle);
140 unsigned int Shader::getRefCount() const
145 bool Shader::isFlaggedForDeletion() const
147 return mDeleteStatus;
150 void Shader::flagForDeletion()
152 mDeleteStatus = true;
155 const std::vector<gl::PackedVarying> &Shader::getVaryings() const
157 return mShader->getVaryings();
160 const std::vector<sh::Uniform> &Shader::getUniforms() const
162 return mShader->getUniforms();
165 const std::vector<sh::InterfaceBlock> &Shader::getInterfaceBlocks() const
167 return mShader->getInterfaceBlocks();
170 const std::vector<sh::Attribute> &Shader::getActiveAttributes() const
172 return mShader->getActiveAttributes();
175 const std::vector<sh::Attribute> &Shader::getActiveOutputVariables() const
177 return mShader->getActiveOutputVariables();
180 std::vector<gl::PackedVarying> &Shader::getVaryings()
182 return mShader->getVaryings();
185 std::vector<sh::Uniform> &Shader::getUniforms()
187 return mShader->getUniforms();
190 std::vector<sh::InterfaceBlock> &Shader::getInterfaceBlocks()
192 return mShader->getInterfaceBlocks();
195 std::vector<sh::Attribute> &Shader::getActiveAttributes()
197 return mShader->getActiveAttributes();
200 std::vector<sh::Attribute> &Shader::getActiveOutputVariables()
202 return mShader->getActiveOutputVariables();