diff options
Diffstat (limited to 'src/3rdparty/angle/src/libGLESv2/Program.cpp')
-rw-r--r-- | src/3rdparty/angle/src/libGLESv2/Program.cpp | 162 |
1 files changed, 149 insertions, 13 deletions
diff --git a/src/3rdparty/angle/src/libGLESv2/Program.cpp b/src/3rdparty/angle/src/libGLESv2/Program.cpp index c38aa5a61a..8a9fb04800 100644 --- a/src/3rdparty/angle/src/libGLESv2/Program.cpp +++ b/src/3rdparty/angle/src/libGLESv2/Program.cpp @@ -1,6 +1,6 @@ #include "precompiled.h" // -// Copyright (c) 2002-2013 The ANGLE Project Authors. All rights reserved. +// 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. // @@ -95,32 +95,36 @@ void InfoLog::append(const char *format, ...) return; } - char info[1024]; - va_list vararg; va_start(vararg, format); - vsnprintf(info, sizeof(info), format, vararg); + size_t infoLength = vsnprintf(NULL, 0, format, vararg); va_end(vararg); - size_t infoLength = strlen(info); + char *logPointer = NULL; if (!mInfoLog) { mInfoLog = new char[infoLength + 2]; - strcpy(mInfoLog, info); - strcpy(mInfoLog + infoLength, "\n"); + logPointer = mInfoLog; } else { - size_t logLength = strlen(mInfoLog); - char *newLog = new char[logLength + infoLength + 2]; + size_t currentlogLength = strlen(mInfoLog); + char *newLog = new char[currentlogLength + infoLength + 2]; strcpy(newLog, mInfoLog); - strcpy(newLog + logLength, info); - strcpy(newLog + logLength + infoLength, "\n"); delete[] mInfoLog; mInfoLog = newLog; + + logPointer = mInfoLog + currentlogLength; } + + va_start(vararg, format); + vsnprintf(logPointer, infoLength, format, vararg); + va_end(vararg); + + logPointer[infoLength] = 0; + strcpy(logPointer + infoLength, "\n"); } void InfoLog::reset() @@ -141,6 +145,8 @@ Program::Program(rx::Renderer *renderer, ResourceManager *manager, GLuint handle mLinked = false; mRefCount = 0; mRenderer = renderer; + + resetUniformBlockBindings(); } Program::~Program() @@ -243,9 +249,11 @@ bool Program::link() unlink(false); mInfoLog.reset(); + resetUniformBlockBindings(); mProgramBinary.set(new ProgramBinary(mRenderer)); - mLinked = mProgramBinary->link(mInfoLog, mAttributeBindings, mFragmentShader, mVertexShader); + mLinked = mProgramBinary->link(mInfoLog, mAttributeBindings, mFragmentShader, mVertexShader, + mTransformFeedbackVaryings, mTransformFeedbackBufferMode); return mLinked; } @@ -290,7 +298,7 @@ bool Program::isLinked() return mLinked; } -ProgramBinary* Program::getProgramBinary() +ProgramBinary* Program::getProgramBinary() const { return mProgramBinary.get(); } @@ -522,4 +530,132 @@ bool Program::isValidated() const } } +GLint Program::getActiveUniformBlockCount() +{ + ProgramBinary *programBinary = getProgramBinary(); + if (programBinary) + { + return static_cast<GLint>(programBinary->getActiveUniformBlockCount()); + } + else + { + return 0; + } +} + +GLint Program::getActiveUniformBlockMaxLength() +{ + ProgramBinary *programBinary = getProgramBinary(); + if (programBinary) + { + return static_cast<GLint>(programBinary->getActiveUniformBlockMaxLength()); + } + else + { + return 0; + } +} + +void Program::bindUniformBlock(GLuint uniformBlockIndex, GLuint uniformBlockBinding) +{ + mUniformBlockBindings[uniformBlockIndex] = uniformBlockBinding; +} + +GLuint Program::getUniformBlockBinding(GLuint uniformBlockIndex) const +{ + return mUniformBlockBindings[uniformBlockIndex]; +} + +void Program::resetUniformBlockBindings() +{ + for (unsigned int blockId = 0; blockId < IMPLEMENTATION_MAX_COMBINED_SHADER_UNIFORM_BUFFERS; blockId++) + { + mUniformBlockBindings[blockId] = 0; + } +} + +void Program::setTransformFeedbackVaryings(GLsizei count, const GLchar *const *varyings, GLenum bufferMode) +{ + mTransformFeedbackVaryings.resize(count); + for (GLsizei i = 0; i < count; i++) + { + mTransformFeedbackVaryings[i] = varyings[i]; + } + + mTransformFeedbackBufferMode = bufferMode; +} + +void Program::getTransformFeedbackVarying(GLuint index, GLsizei bufSize, GLsizei *length, GLsizei *size, GLenum *type, GLchar *name) const +{ + ProgramBinary *programBinary = getProgramBinary(); + if (programBinary && index < programBinary->getTransformFeedbackVaryingCount()) + { + const LinkedVarying &varying = programBinary->getTransformFeedbackVarying(index); + GLsizei lastNameIdx = std::min(bufSize - 1, static_cast<GLsizei>(varying.name.length())); + if (length) + { + *length = lastNameIdx; + } + if (size) + { + *size = varying.size; + } + if (type) + { + *type = varying.type; + } + if (name) + { + memcpy(name, varying.name.c_str(), lastNameIdx); + name[lastNameIdx] = '\0'; + } + } +} + +GLsizei Program::getTransformFeedbackVaryingCount() const +{ + ProgramBinary *programBinary = getProgramBinary(); + if (programBinary) + { + return static_cast<GLsizei>(programBinary->getTransformFeedbackVaryingCount()); + } + else + { + return 0; + } +} + +GLsizei Program::getTransformFeedbackVaryingMaxLength() const +{ + ProgramBinary *programBinary = getProgramBinary(); + if (programBinary) + { + GLsizei maxSize = 0; + for (size_t i = 0; i < programBinary->getTransformFeedbackVaryingCount(); i++) + { + const LinkedVarying &varying = programBinary->getTransformFeedbackVarying(i); + maxSize = std::max(maxSize, static_cast<GLsizei>(varying.name.length() + 1)); + } + + return maxSize; + } + else + { + return 0; + } +} + +GLenum Program::getTransformFeedbackBufferMode() const +{ + ProgramBinary *programBinary = getProgramBinary(); + if (programBinary) + { + return programBinary->getTransformFeedbackBufferMode(); + } + else + { + return mTransformFeedbackBufferMode; + } +} + } |