Commit f611316b by Jamie Madill

Use stream operators for appending to InfoLog.

Also add a helper class to keep the previous behaviour of automatically appending a newline after every new message. BUG=angleproject:992 Change-Id: I0ff5d2846175cf19de7a6af295af24a92451456f Reviewed-on: https://chromium-review.googlesource.com/268744Tested-by: 's avatarJamie Madill <jmadill@chromium.org> Reviewed-by: 's avatarGeoff Lang <geofflang@chromium.org>
parent 71c3b2c7
...@@ -71,8 +71,62 @@ class InfoLog : angle::NonCopyable ...@@ -71,8 +71,62 @@ class InfoLog : angle::NonCopyable
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 reset(); void reset();
// This helper class ensures we append a newline after writing a line.
class StreamHelper : angle::NonCopyable
{
public:
StreamHelper(StreamHelper &&rhs)
: mStream(rhs.mStream)
{
rhs.mStream = nullptr;
}
StreamHelper &operator=(StreamHelper &&rhs)
{
std::swap(mStream, rhs.mStream);
return *this;
}
~StreamHelper()
{
// Write newline when destroyed on the stack
if (mStream)
{
(*mStream) << std::endl;
}
}
template <typename T>
StreamHelper &operator<<(const T &value)
{
(*mStream) << value;
return *this;
}
private:
friend class InfoLog;
StreamHelper(std::stringstream *stream)
: mStream(stream)
{
ASSERT(stream);
}
std::stringstream *mStream;
};
template <typename T>
StreamHelper operator<<(const T &value)
{
StreamHelper helper(&mStream);
helper << value;
return helper;
}
std::string str() const { return mStream.str(); }
private: private:
std::stringstream mStream; std::stringstream mStream;
}; };
......
...@@ -21,10 +21,23 @@ TEST(InfoLogTest, LogLengthCountsTerminator) ...@@ -21,10 +21,23 @@ TEST(InfoLogTest, LogLengthCountsTerminator)
{ {
InfoLog infoLog; InfoLog infoLog;
EXPECT_EQ(0u, infoLog.getLength()); EXPECT_EQ(0u, infoLog.getLength());
infoLog.append(" "); infoLog << " ";
// " \n\0" = 3 characters // " \n\0" = 3 characters
EXPECT_EQ(3u, infoLog.getLength()); EXPECT_EQ(3u, infoLog.getLength());
} }
// Tests that newlines get appended to the info log properly.
TEST(InfoLogTest, AppendingNewline)
{
InfoLog infoLog;
infoLog << "First" << 1 << 'x';
infoLog << "Second" << 2 << 'y';
std::string expected = "First1x\nSecond2y\n";
EXPECT_EQ(expected, infoLog.str());
}
} // namespace } // namespace
...@@ -262,7 +262,7 @@ int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, ShaderD3 ...@@ -262,7 +262,7 @@ int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, ShaderD3
} }
else else
{ {
infoLog.append("Could not pack varying %s", varying->name.c_str()); infoLog << "Could not pack varying " << varying->name;
return -1; return -1;
} }
} }
...@@ -287,7 +287,7 @@ int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, ShaderD3 ...@@ -287,7 +287,7 @@ int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, ShaderD3
{ {
if (!packVarying(varying, maxVaryingVectors, packing)) if (!packVarying(varying, maxVaryingVectors, packing))
{ {
infoLog.append("Could not pack varying %s", varying->name.c_str()); infoLog << "Could not pack varying " << varying->name;
return -1; return -1;
} }
...@@ -298,7 +298,9 @@ int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, ShaderD3 ...@@ -298,7 +298,9 @@ int DynamicHLSL::packVaryings(InfoLog &infoLog, VaryingPacking packing, ShaderD3
if (!found) if (!found)
{ {
infoLog.append("Transform feedback varying %s does not exist in the vertex shader.", transformFeedbackVarying.c_str()); infoLog << "Transform feedback varying "
<< transformFeedbackVarying
<< " does not exist in the vertex shader.";
return -1; return -1;
} }
} }
...@@ -757,7 +759,7 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, InfoLog &infoLog, ...@@ -757,7 +759,7 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, InfoLog &infoLog,
if (usesFragColor && usesFragData) if (usesFragColor && usesFragData)
{ {
infoLog.append("Cannot use both gl_FragColor and gl_FragData in the same fragment shader."); infoLog << "Cannot use both gl_FragColor and gl_FragData in the same fragment shader.";
return false; return false;
} }
...@@ -780,7 +782,7 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, InfoLog &infoLog, ...@@ -780,7 +782,7 @@ bool DynamicHLSL::generateShaderLinkHLSL(const gl::Data &data, InfoLog &infoLog,
if (static_cast<GLuint>(registersNeeded) > data.caps->maxVaryingVectors) if (static_cast<GLuint>(registersNeeded) > data.caps->maxVaryingVectors)
{ {
infoLog.append("No varying registers left to support gl_FragCoord/gl_PointCoord"); infoLog << "No varying registers left to support gl_FragCoord/gl_PointCoord";
return false; return false;
} }
......
...@@ -268,11 +268,11 @@ gl::Error HLSLCompiler::compileToBinary(gl::InfoLog &infoLog, const std::string ...@@ -268,11 +268,11 @@ gl::Error HLSLCompiler::compileToBinary(gl::InfoLog &infoLog, const std::string
return gl::Error(GL_OUT_OF_MEMORY, "HLSL compiler had an unexpected failure, result: 0x%X.", result); return gl::Error(GL_OUT_OF_MEMORY, "HLSL compiler had an unexpected failure, result: 0x%X.", result);
} }
infoLog.append("Warning: D3D shader compilation failed with %s flags.", configs[i].name.c_str()); infoLog << "Warning: D3D shader compilation failed with " << configs[i].name << " flags.";
if (i + 1 < configs.size()) if (i + 1 < configs.size())
{ {
infoLog.append(" Retrying with %s.\n", configs[i + 1].name.c_str()); infoLog << " Retrying with " << configs[i + 1].name;
} }
} }
} }
......
...@@ -360,7 +360,9 @@ bool ProgramD3D::validateSamplers(gl::InfoLog *infoLog, const gl::Caps &caps) ...@@ -360,7 +360,9 @@ bool ProgramD3D::validateSamplers(gl::InfoLog *infoLog, const gl::Caps &caps)
{ {
if (infoLog) if (infoLog)
{ {
infoLog->append("Sampler uniform (%d) exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)", unit, caps.maxCombinedTextureImageUnits); (*infoLog) << "Sampler uniform (" << unit
<< ") exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS ("
<< caps.maxCombinedTextureImageUnits << ")";
} }
mCachedValidateSamplersResult = false; mCachedValidateSamplersResult = false;
...@@ -373,7 +375,8 @@ bool ProgramD3D::validateSamplers(gl::InfoLog *infoLog, const gl::Caps &caps) ...@@ -373,7 +375,8 @@ bool ProgramD3D::validateSamplers(gl::InfoLog *infoLog, const gl::Caps &caps)
{ {
if (infoLog) if (infoLog)
{ {
infoLog->append("Samplers of conflicting types refer to the same texture image unit (%d).", unit); (*infoLog) << "Samplers of conflicting types refer to the same texture image unit ("
<< unit << ").";
} }
mCachedValidateSamplersResult = false; mCachedValidateSamplersResult = false;
...@@ -397,7 +400,9 @@ bool ProgramD3D::validateSamplers(gl::InfoLog *infoLog, const gl::Caps &caps) ...@@ -397,7 +400,9 @@ bool ProgramD3D::validateSamplers(gl::InfoLog *infoLog, const gl::Caps &caps)
{ {
if (infoLog) if (infoLog)
{ {
infoLog->append("Sampler uniform (%d) exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS (%d)", unit, caps.maxCombinedTextureImageUnits); (*infoLog) << "Sampler uniform (" << unit
<< ") exceeds GL_MAX_COMBINED_TEXTURE_IMAGE_UNITS ("
<< caps.maxCombinedTextureImageUnits << ")";
} }
mCachedValidateSamplersResult = false; mCachedValidateSamplersResult = false;
...@@ -410,7 +415,8 @@ bool ProgramD3D::validateSamplers(gl::InfoLog *infoLog, const gl::Caps &caps) ...@@ -410,7 +415,8 @@ bool ProgramD3D::validateSamplers(gl::InfoLog *infoLog, const gl::Caps &caps)
{ {
if (infoLog) if (infoLog)
{ {
infoLog->append("Samplers of conflicting types refer to the same texture image unit (%d).", unit); (*infoLog) << "Samplers of conflicting types refer to the same texture image unit ("
<< unit << ").";
} }
mCachedValidateSamplersResult = false; mCachedValidateSamplersResult = false;
...@@ -433,7 +439,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -433,7 +439,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
int compileFlags = stream->readInt<int>(); int compileFlags = stream->readInt<int>();
if (compileFlags != ANGLE_COMPILE_OPTIMIZATION_LEVEL) if (compileFlags != ANGLE_COMPILE_OPTIMIZATION_LEVEL)
{ {
infoLog.append("Mismatched compilation flags."); infoLog << "Mismatched compilation flags.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return LinkResult(false, gl::Error(GL_NO_ERROR));
} }
...@@ -464,7 +470,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -464,7 +470,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
const unsigned int uniformCount = stream->readInt<unsigned int>(); const unsigned int uniformCount = stream->readInt<unsigned int>();
if (stream->error()) if (stream->error())
{ {
infoLog.append("Invalid program binary."); infoLog << "Invalid program binary.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return LinkResult(false, gl::Error(GL_NO_ERROR));
} }
...@@ -497,7 +503,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -497,7 +503,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
const unsigned int uniformIndexCount = stream->readInt<unsigned int>(); const unsigned int uniformIndexCount = stream->readInt<unsigned int>();
if (stream->error()) if (stream->error())
{ {
infoLog.append("Invalid program binary."); infoLog << "Invalid program binary.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return LinkResult(false, gl::Error(GL_NO_ERROR));
} }
...@@ -512,7 +518,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -512,7 +518,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
unsigned int uniformBlockCount = stream->readInt<unsigned int>(); unsigned int uniformBlockCount = stream->readInt<unsigned int>();
if (stream->error()) if (stream->error())
{ {
infoLog.append("Invalid program binary."); infoLog << "Invalid program binary.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return LinkResult(false, gl::Error(GL_NO_ERROR));
} }
...@@ -602,7 +608,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -602,7 +608,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
if (!shaderExecutable) if (!shaderExecutable)
{ {
infoLog.append("Could not create vertex shader."); infoLog << "Could not create vertex shader.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return LinkResult(false, gl::Error(GL_NO_ERROR));
} }
...@@ -640,7 +646,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -640,7 +646,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
if (!shaderExecutable) if (!shaderExecutable)
{ {
infoLog.append("Could not create pixel shader."); infoLog << "Could not create pixel shader.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return LinkResult(false, gl::Error(GL_NO_ERROR));
} }
...@@ -666,7 +672,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -666,7 +672,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
if (!mGeometryExecutable) if (!mGeometryExecutable)
{ {
infoLog.append("Could not create geometry shader."); infoLog << "Could not create geometry shader.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return LinkResult(false, gl::Error(GL_NO_ERROR));
} }
stream->skip(geometryShaderSize); stream->skip(geometryShaderSize);
...@@ -678,7 +684,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream) ...@@ -678,7 +684,7 @@ LinkResult ProgramD3D::load(gl::InfoLog &infoLog, gl::BinaryInputStream *stream)
GUID identifier = mRenderer->getAdapterIdentifier(); GUID identifier = mRenderer->getAdapterIdentifier();
if (memcmp(&identifier, &binaryIdentifier, sizeof(GUID)) != 0) if (memcmp(&identifier, &binaryIdentifier, sizeof(GUID)) != 0)
{ {
infoLog.append("Invalid program binary."); infoLog << "Invalid program binary.";
return LinkResult(false, gl::Error(GL_NO_ERROR)); return LinkResult(false, gl::Error(GL_NO_ERROR));
} }
...@@ -1188,7 +1194,7 @@ bool ProgramD3D::assignUniformBlockRegister(gl::InfoLog &infoLog, gl::UniformBlo ...@@ -1188,7 +1194,7 @@ bool ProgramD3D::assignUniformBlockRegister(gl::InfoLog &infoLog, gl::UniformBlo
uniformBlock->vsRegisterIndex = registerIndex; uniformBlock->vsRegisterIndex = registerIndex;
if (registerIndex - mRenderer->getReservedVertexUniformBuffers() >= caps.maxVertexUniformBlocks) if (registerIndex - mRenderer->getReservedVertexUniformBuffers() >= caps.maxVertexUniformBlocks)
{ {
infoLog.append("Vertex shader uniform block count exceed GL_MAX_VERTEX_UNIFORM_BLOCKS (%u)", caps.maxVertexUniformBlocks); infoLog << "Vertex shader uniform block count exceed GL_MAX_VERTEX_UNIFORM_BLOCKS (" << caps.maxVertexUniformBlocks << ")";
return false; return false;
} }
} }
...@@ -1197,7 +1203,7 @@ bool ProgramD3D::assignUniformBlockRegister(gl::InfoLog &infoLog, gl::UniformBlo ...@@ -1197,7 +1203,7 @@ bool ProgramD3D::assignUniformBlockRegister(gl::InfoLog &infoLog, gl::UniformBlo
uniformBlock->psRegisterIndex = registerIndex; uniformBlock->psRegisterIndex = registerIndex;
if (registerIndex - mRenderer->getReservedFragmentUniformBuffers() >= caps.maxFragmentUniformBlocks) if (registerIndex - mRenderer->getReservedFragmentUniformBuffers() >= caps.maxFragmentUniformBlocks)
{ {
infoLog.append("Fragment shader uniform block count exceed GL_MAX_FRAGMENT_UNIFORM_BLOCKS (%u)", caps.maxFragmentUniformBlocks); infoLog << "Fragment shader uniform block count exceed GL_MAX_FRAGMENT_UNIFORM_BLOCKS (" << caps.maxFragmentUniformBlocks << ")";
return false; return false;
} }
} }
...@@ -1893,16 +1899,16 @@ bool ProgramD3D::indexSamplerUniform(const gl::LinkedUniform &uniform, gl::InfoL ...@@ -1893,16 +1899,16 @@ bool ProgramD3D::indexSamplerUniform(const gl::LinkedUniform &uniform, gl::InfoL
if (!assignSamplers(uniform.vsRegisterIndex, uniform.type, uniform.arraySize, mSamplersVS, if (!assignSamplers(uniform.vsRegisterIndex, uniform.type, uniform.arraySize, mSamplersVS,
&mUsedVertexSamplerRange)) &mUsedVertexSamplerRange))
{ {
infoLog.append("Vertex shader sampler count exceeds the maximum vertex texture units (%d).", infoLog << "Vertex shader sampler count exceeds the maximum vertex texture units ("
mSamplersVS.size()); << mSamplersVS.size() << ").";
return false; return false;
} }
unsigned int maxVertexVectors = mRenderer->getReservedVertexUniformVectors() + caps.maxVertexUniformVectors; unsigned int maxVertexVectors = mRenderer->getReservedVertexUniformVectors() + caps.maxVertexUniformVectors;
if (uniform.vsRegisterIndex + uniform.registerCount > maxVertexVectors) if (uniform.vsRegisterIndex + uniform.registerCount > maxVertexVectors)
{ {
infoLog.append("Vertex shader active uniforms exceed GL_MAX_VERTEX_UNIFORM_VECTORS (%u)", infoLog << "Vertex shader active uniforms exceed GL_MAX_VERTEX_UNIFORM_VECTORS ("
caps.maxVertexUniformVectors); << caps.maxVertexUniformVectors << ").";
return false; return false;
} }
} }
...@@ -1912,16 +1918,16 @@ bool ProgramD3D::indexSamplerUniform(const gl::LinkedUniform &uniform, gl::InfoL ...@@ -1912,16 +1918,16 @@ bool ProgramD3D::indexSamplerUniform(const gl::LinkedUniform &uniform, gl::InfoL
if (!assignSamplers(uniform.psRegisterIndex, uniform.type, uniform.arraySize, mSamplersPS, if (!assignSamplers(uniform.psRegisterIndex, uniform.type, uniform.arraySize, mSamplersPS,
&mUsedPixelSamplerRange)) &mUsedPixelSamplerRange))
{ {
infoLog.append("Pixel shader sampler count exceeds MAX_TEXTURE_IMAGE_UNITS (%d).", infoLog << "Pixel shader sampler count exceeds MAX_TEXTURE_IMAGE_UNITS ("
mSamplersPS.size()); << mSamplersPS.size() << ").";
return false; return false;
} }
unsigned int maxFragmentVectors = mRenderer->getReservedFragmentUniformVectors() + caps.maxFragmentUniformVectors; unsigned int maxFragmentVectors = mRenderer->getReservedFragmentUniformVectors() + caps.maxFragmentUniformVectors;
if (uniform.psRegisterIndex + uniform.registerCount > maxFragmentVectors) if (uniform.psRegisterIndex + uniform.registerCount > maxFragmentVectors)
{ {
infoLog.append("Fragment shader active uniforms exceed GL_MAX_FRAGMENT_UNIFORM_VECTORS (%u)", infoLog << "Fragment shader active uniforms exceed GL_MAX_FRAGMENT_UNIFORM_VECTORS ("
caps.maxFragmentUniformVectors); << caps.maxFragmentUniformVectors << ").";
return false; return false;
} }
} }
......
...@@ -113,7 +113,7 @@ LinkResult ProgramGL::link(const gl::Data &data, gl::InfoLog &infoLog, ...@@ -113,7 +113,7 @@ LinkResult ProgramGL::link(const gl::Data &data, gl::InfoLog &infoLog,
mFunctions->deleteProgram(mProgramID); mFunctions->deleteProgram(mProgramID);
mProgramID = 0; mProgramID = 0;
infoLog.append(&buf[0]); infoLog << &buf[0];
TRACE("\n%s", &buf[0]); TRACE("\n%s", &buf[0]);
// TODO, return GL_OUT_OF_MEMORY or just fail the link? This is an unexpected case // TODO, return GL_OUT_OF_MEMORY or just fail the link? This is an unexpected case
......
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