| // |
| // Copyright (c) 2002-2014 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.cpp: Implements the gl::Shader class and its 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. |
| |
| #include "libGLESv2/Shader.h" |
| #include "libGLESv2/renderer/Renderer.h" |
| #include "libGLESv2/renderer/ShaderImpl.h" |
| #include "libGLESv2/Constants.h" |
| #include "libGLESv2/ResourceManager.h" |
| |
| #include "common/utilities.h" |
| |
| #include "GLSLANG/ShaderLang.h" |
| |
| #include <sstream> |
| |
| namespace gl |
| { |
| |
| Shader::Shader(ResourceManager *manager, rx::ShaderImpl *impl, GLenum type, GLuint handle) |
| : mShader(impl), |
| mType(type), |
| mHandle(handle), |
| mResourceManager(manager), |
| mRefCount(0), |
| mDeleteStatus(false), |
| mCompiled(false) |
| { |
| ASSERT(impl); |
| } |
| |
| Shader::~Shader() |
| { |
| } |
| |
| GLuint Shader::getHandle() const |
| { |
| return mHandle; |
| } |
| |
| void Shader::setSource(GLsizei count, const char *const *string, const GLint *length) |
| { |
| std::ostringstream stream; |
| |
| for (int i = 0; i < count; i++) |
| { |
| stream << string[i]; |
| } |
| |
| mSource = stream.str(); |
| } |
| |
| int Shader::getInfoLogLength() const |
| { |
| return mShader->getInfoLog().empty() ? 0 : (mShader->getInfoLog().length() + 1); |
| } |
| |
| void Shader::getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) const |
| { |
| int index = 0; |
| |
| if (bufSize > 0) |
| { |
| index = std::min(bufSize - 1, static_cast<GLsizei>(mShader->getInfoLog().length())); |
| memcpy(infoLog, mShader->getInfoLog().c_str(), index); |
| |
| infoLog[index] = '\0'; |
| } |
| |
| if (length) |
| { |
| *length = index; |
| } |
| } |
| |
| int Shader::getSourceLength() const |
| { |
| return mSource.empty() ? 0 : (mSource.length() + 1); |
| } |
| |
| int Shader::getTranslatedSourceLength() const |
| { |
| return mShader->getTranslatedSource().empty() ? 0 : (mShader->getTranslatedSource().length() + 1); |
| } |
| |
| void Shader::getSourceImpl(const std::string &source, GLsizei bufSize, GLsizei *length, char *buffer) |
| { |
| int index = 0; |
| |
| if (bufSize > 0) |
| { |
| index = std::min(bufSize - 1, static_cast<GLsizei>(source.length())); |
| memcpy(buffer, source.c_str(), index); |
| |
| buffer[index] = '\0'; |
| } |
| |
| if (length) |
| { |
| *length = index; |
| } |
| } |
| |
| void Shader::getSource(GLsizei bufSize, GLsizei *length, char *buffer) const |
| { |
| getSourceImpl(mSource, bufSize, length, buffer); |
| } |
| |
| void Shader::getTranslatedSource(GLsizei bufSize, GLsizei *length, char *buffer) const |
| { |
| getSourceImpl(mShader->getTranslatedSource(), bufSize, length, buffer); |
| } |
| |
| void Shader::compile() |
| { |
| mCompiled = mShader->compile(mSource); |
| } |
| |
| void Shader::addRef() |
| { |
| mRefCount++; |
| } |
| |
| void Shader::release() |
| { |
| mRefCount--; |
| |
| if (mRefCount == 0 && mDeleteStatus) |
| { |
| mResourceManager->deleteShader(mHandle); |
| } |
| } |
| |
| unsigned int Shader::getRefCount() const |
| { |
| return mRefCount; |
| } |
| |
| bool Shader::isFlaggedForDeletion() const |
| { |
| return mDeleteStatus; |
| } |
| |
| void Shader::flagForDeletion() |
| { |
| mDeleteStatus = true; |
| } |
| |
| const std::vector<gl::PackedVarying> &Shader::getVaryings() const |
| { |
| return mShader->getVaryings(); |
| } |
| |
| const std::vector<sh::Uniform> &Shader::getUniforms() const |
| { |
| return mShader->getUniforms(); |
| } |
| |
| const std::vector<sh::InterfaceBlock> &Shader::getInterfaceBlocks() const |
| { |
| return mShader->getInterfaceBlocks(); |
| } |
| |
| const std::vector<sh::Attribute> &Shader::getActiveAttributes() const |
| { |
| return mShader->getActiveAttributes(); |
| } |
| |
| const std::vector<sh::Attribute> &Shader::getActiveOutputVariables() const |
| { |
| return mShader->getActiveOutputVariables(); |
| } |
| |
| std::vector<gl::PackedVarying> &Shader::getVaryings() |
| { |
| return mShader->getVaryings(); |
| } |
| |
| std::vector<sh::Uniform> &Shader::getUniforms() |
| { |
| return mShader->getUniforms(); |
| } |
| |
| std::vector<sh::InterfaceBlock> &Shader::getInterfaceBlocks() |
| { |
| return mShader->getInterfaceBlocks(); |
| } |
| |
| std::vector<sh::Attribute> &Shader::getActiveAttributes() |
| { |
| return mShader->getActiveAttributes(); |
| } |
| |
| std::vector<sh::Attribute> &Shader::getActiveOutputVariables() |
| { |
| return mShader->getActiveOutputVariables(); |
| } |
| |
| } |