Commit 71c3b2c7 by Jamie Madill

Use a std::stringstream for Program's InfoLog.

This should help WebKit avoid needing to apply a local patch. Also clean up the style in this file a bit. BUG=angleproject:307,angleproject:992 Change-Id: I41ecf7cbfa20b469b3731215ef28cb36253ba186 Reviewed-on: https://chromium-review.googlesource.com/269849Tested-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 4052dfc8
...@@ -55,38 +55,32 @@ AttributeBindings::~AttributeBindings() ...@@ -55,38 +55,32 @@ AttributeBindings::~AttributeBindings()
{ {
} }
InfoLog::InfoLog() : mInfoLog(NULL) InfoLog::InfoLog()
{ {
} }
InfoLog::~InfoLog() InfoLog::~InfoLog()
{ {
delete[] mInfoLog;
} }
size_t InfoLog::getLength() const
int InfoLog::getLength() const
{ {
if (!mInfoLog) const std::string &logString = mStream.str();
{ return logString.empty() ? 0 : logString.length() + 1;
return 0;
}
else
{
return strlen(mInfoLog) + 1;
}
} }
void InfoLog::getLog(GLsizei bufSize, GLsizei *length, char *infoLog) void InfoLog::getLog(GLsizei bufSize, GLsizei *length, char *infoLog)
{ {
int index = 0; size_t index = 0;
if (bufSize > 0) if (bufSize > 0)
{ {
if (mInfoLog) const std::string str(mStream.str());
if (!str.empty())
{ {
index = std::min(bufSize - 1, (int)strlen(mInfoLog)); index = std::min(static_cast<size_t>(bufSize) - 1, str.length());
memcpy(infoLog, mInfoLog, index); memcpy(infoLog, str.c_str(), index);
} }
infoLog[index] = '\0'; infoLog[index] = '\0';
...@@ -94,7 +88,7 @@ void InfoLog::getLog(GLsizei bufSize, GLsizei *length, char *infoLog) ...@@ -94,7 +88,7 @@ void InfoLog::getLog(GLsizei bufSize, GLsizei *length, char *infoLog)
if (length) if (length)
{ {
*length = index; *length = static_cast<GLsizei>(index);
} }
} }
...@@ -116,7 +110,7 @@ void InfoLog::appendSanitized(const char *message) ...@@ -116,7 +110,7 @@ void InfoLog::appendSanitized(const char *message)
} }
while (found != std::string::npos); while (found != std::string::npos);
append("%s", msg.c_str()); mStream << message << std::endl;
} }
void InfoLog::append(const char *format, ...) void InfoLog::append(const char *format, ...)
...@@ -128,52 +122,27 @@ void InfoLog::append(const char *format, ...) ...@@ -128,52 +122,27 @@ void InfoLog::append(const char *format, ...)
va_list vararg; va_list vararg;
va_start(vararg, format); va_start(vararg, format);
size_t infoLength = vsnprintf(NULL, 0, format, vararg); std::string tempString(FormatString(format, vararg));
va_end(vararg);
char *logPointer = NULL;
if (!mInfoLog)
{
mInfoLog = new char[infoLength + 2];
logPointer = mInfoLog;
}
else
{
size_t currentlogLength = strlen(mInfoLog);
char *newLog = new char[currentlogLength + infoLength + 2];
strcpy(newLog, mInfoLog);
delete[] mInfoLog;
mInfoLog = newLog;
logPointer = mInfoLog + currentlogLength;
}
va_start(vararg, format);
vsnprintf(logPointer, infoLength, format, vararg);
va_end(vararg); va_end(vararg);
logPointer[infoLength] = 0; mStream << tempString << std::endl;
strcpy(logPointer + infoLength, "\n");
} }
void InfoLog::reset() void InfoLog::reset()
{ {
if (mInfoLog)
{
delete [] mInfoLog;
mInfoLog = NULL;
}
} }
VariableLocation::VariableLocation() VariableLocation::VariableLocation()
: name(), element(0), index(0) : name(),
element(0),
index(0)
{ {
} }
VariableLocation::VariableLocation(const std::string &name, unsigned int element, unsigned int index) VariableLocation::VariableLocation(const std::string &name, unsigned int element, unsigned int index)
: name(name), element(element), index(index) : name(name),
element(element),
index(index)
{ {
} }
...@@ -192,8 +161,8 @@ Program::Program(rx::ProgramImpl *impl, ResourceManager *manager, GLuint handle) ...@@ -192,8 +161,8 @@ Program::Program(rx::ProgramImpl *impl, ResourceManager *manager, GLuint handle)
mValidated(false), mValidated(false),
mTransformFeedbackVaryings(), mTransformFeedbackVaryings(),
mTransformFeedbackBufferMode(GL_NONE), mTransformFeedbackBufferMode(GL_NONE),
mFragmentShader(NULL), mFragmentShader(nullptr),
mVertexShader(NULL), mVertexShader(nullptr),
mLinked(false), mLinked(false),
mDeleteStatus(false), mDeleteStatus(false),
mRefCount(0), mRefCount(0),
...@@ -210,12 +179,12 @@ Program::~Program() ...@@ -210,12 +179,12 @@ Program::~Program()
{ {
unlink(true); unlink(true);
if (mVertexShader != NULL) if (mVertexShader != nullptr)
{ {
mVertexShader->release(); mVertexShader->release();
} }
if (mFragmentShader != NULL) if (mFragmentShader != nullptr)
{ {
mFragmentShader->release(); mFragmentShader->release();
} }
...@@ -260,7 +229,7 @@ bool Program::detachShader(Shader *shader) ...@@ -260,7 +229,7 @@ bool Program::detachShader(Shader *shader)
} }
mVertexShader->release(); mVertexShader->release();
mVertexShader = NULL; mVertexShader = nullptr;
} }
else if (shader->getType() == GL_FRAGMENT_SHADER) else if (shader->getType() == GL_FRAGMENT_SHADER)
{ {
...@@ -270,7 +239,7 @@ bool Program::detachShader(Shader *shader) ...@@ -270,7 +239,7 @@ bool Program::detachShader(Shader *shader)
} }
mFragmentShader->release(); mFragmentShader->release();
mFragmentShader = NULL; mFragmentShader = nullptr;
} }
else UNREACHABLE(); else UNREACHABLE();
...@@ -387,13 +356,13 @@ void Program::unlink(bool destroy) ...@@ -387,13 +356,13 @@ void Program::unlink(bool destroy)
if (mFragmentShader) if (mFragmentShader)
{ {
mFragmentShader->release(); mFragmentShader->release();
mFragmentShader = NULL; mFragmentShader = nullptr;
} }
if (mVertexShader) if (mVertexShader)
{ {
mVertexShader->release(); mVertexShader->release();
mVertexShader = NULL; mVertexShader = nullptr;
} }
} }
...@@ -552,7 +521,7 @@ Error Program::saveBinary(GLenum *binaryFormat, void *binary, GLsizei bufSize, G ...@@ -552,7 +521,7 @@ Error Program::saveBinary(GLenum *binaryFormat, void *binary, GLsizei bufSize, G
GLint Program::getBinaryLength() const GLint Program::getBinaryLength() const
{ {
GLint length; GLint length;
Error error = saveBinary(NULL, NULL, std::numeric_limits<GLint>::max(), &length); Error error = saveBinary(nullptr, nullptr, std::numeric_limits<GLint>::max(), &length);
if (error.isError()) if (error.isError())
{ {
return 0; return 0;
...@@ -583,7 +552,7 @@ unsigned int Program::getRefCount() const ...@@ -583,7 +552,7 @@ unsigned int Program::getRefCount() const
int Program::getInfoLogLength() const int Program::getInfoLogLength() const
{ {
return mInfoLog.getLength(); return static_cast<int>(mInfoLog.getLength());
} }
void Program::getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog) void Program::getInfoLog(GLsizei bufSize, GLsizei *length, char *infoLog)
......
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
#include <GLSLANG/ShaderLang.h> #include <GLSLANG/ShaderLang.h>
#include <vector> #include <vector>
#include <sstream>
#include <string> #include <string>
#include <set> #include <set>
...@@ -66,14 +67,14 @@ class InfoLog : angle::NonCopyable ...@@ -66,14 +67,14 @@ class InfoLog : angle::NonCopyable
InfoLog(); InfoLog();
~InfoLog(); ~InfoLog();
int getLength() const; size_t getLength() const;
void getLog(GLsizei bufSize, GLsizei *length, char *infoLog); void getLog(GLsizei bufSize, GLsizei *length, char *infoLog);
void appendSanitized(const char *message); void appendSanitized(const char *message);
void append(const char *info, ...); void append(const char *info, ...);
void reset(); void reset();
private: private:
char *mInfoLog; std::stringstream mStream;
}; };
// Struct used for correlating uniforms/elements of uniform arrays to handles // Struct used for correlating uniforms/elements of uniform arrays to handles
......
//
// Copyright 2015 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.
//
// Unit tests for Program and related classes.
//
#include <gtest/gtest.h>
#include "angle_unittests_utils.h"
#include "libANGLE/Program.h"
using namespace gl;
namespace
{
// Tests that the log length properly counts the terminating \0.
TEST(InfoLogTest, LogLengthCountsTerminator)
{
InfoLog infoLog;
EXPECT_EQ(0u, infoLog.getLength());
infoLog.append(" ");
// " \n\0" = 3 characters
EXPECT_EQ(3u, infoLog.getLength());
}
} // namespace
...@@ -21,6 +21,7 @@ ...@@ -21,6 +21,7 @@
'<(angle_path)/src/libANGLE/Fence_unittest.cpp', '<(angle_path)/src/libANGLE/Fence_unittest.cpp',
'<(angle_path)/src/libANGLE/HandleAllocator_unittest.cpp', '<(angle_path)/src/libANGLE/HandleAllocator_unittest.cpp',
'<(angle_path)/src/libANGLE/ImageIndexIterator_unittest.cpp', '<(angle_path)/src/libANGLE/ImageIndexIterator_unittest.cpp',
'<(angle_path)/src/libANGLE/Program_unittest.cpp',
'<(angle_path)/src/libANGLE/ResourceManager_unittest.cpp', '<(angle_path)/src/libANGLE/ResourceManager_unittest.cpp',
'<(angle_path)/src/libANGLE/Surface_unittest.cpp', '<(angle_path)/src/libANGLE/Surface_unittest.cpp',
'<(angle_path)/src/libANGLE/TransformFeedback_unittest.cpp', '<(angle_path)/src/libANGLE/TransformFeedback_unittest.cpp',
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment