diff --git a/src/Magnum/GL/AbstractShaderProgram.cpp b/src/Magnum/GL/AbstractShaderProgram.cpp index 59768aac7..4b5e53be7 100644 --- a/src/Magnum/GL/AbstractShaderProgram.cpp +++ b/src/Magnum/GL/AbstractShaderProgram.cpp @@ -31,6 +31,7 @@ #ifndef MAGNUM_TARGET_WEBGL #include #endif +#include /** @todo remove once -free */ #include #include @@ -606,17 +607,24 @@ bool AbstractShaderProgram::checkLink() { be said, handle that as well. */ Context::current().state().shaderProgram.cleanLogImplementation(message); + /* Usually the driver messages contain a newline at the end. But sometimes + not, such as in case of a program link error due to shaders not being + compiled yet on Mesa; sometimes there's two newlines, sometimes just a + newline and nothing else etc. Because trying do this in driver-specific + workarounds would involve an impossible task of checking all possible + error messages on every possible driver, just trim all whitespace around + the message always and let Debug add its own newline. */ + const Containers::StringView messageTrimmed = Containers::StringView{message}.trimmed(); + /* Show error log */ if(!success) { - Error out{Debug::Flag::NoNewlineAtTheEnd}; - out << "GL::AbstractShaderProgram::link(): linking failed with the following message:" - << Debug::newline << message; + Error{} << "GL::AbstractShaderProgram::link(): linking failed with the following message:" + << Debug::newline << messageTrimmed; /* Or just warnings, if any */ - } else if(!message.empty()) { - Warning out{Debug::Flag::NoNewlineAtTheEnd}; - out << "GL::AbstractShaderProgram::link(): linking succeeded with the following message:" - << Debug::newline << message; + } else if(messageTrimmed) { + Warning{} << "GL::AbstractShaderProgram::link(): linking succeeded with the following message:" + << Debug::newline << messageTrimmed; } return success; diff --git a/src/Magnum/GL/Shader.cpp b/src/Magnum/GL/Shader.cpp index fdd3036dc..9966b75cf 100644 --- a/src/Magnum/GL/Shader.cpp +++ b/src/Magnum/GL/Shader.cpp @@ -783,17 +783,26 @@ bool Shader::checkCompile() { be said, handle that as well. */ Context::current().state().shader.cleanLogImplementation(message); + /* Usually the driver messages contain a newline at the end. But sometimes + not, such as in case of a program link error due to shaders not being + compiled yet on Mesa; sometimes there's two newlines, sometimes just a + newline and nothing else etc. Because trying do this in driver-specific + workarounds would involve an impossible task of checking all possible + error messages on every possible driver, just trim all whitespace around + the message always and let Debug add its own newline. */ + const Containers::StringView messageTrimmed = Containers::StringView{message}.trimmed(); + /* Show error log */ if(!success) { - Error out{Debug::Flag::NoNewlineAtTheEnd}; - out << "GL::Shader::compile(): compilation of" << shaderName(_type) << "shader" - << "failed with the following message:" << Debug::newline << message; + Error{} << "GL::Shader::compile(): compilation of" << shaderName(_type) + << "shader failed with the following message:" << Debug::newline + << messageTrimmed; /* Or just warnings, if any */ - } else if(!message.empty()) { - Warning out{Debug::Flag::NoNewlineAtTheEnd}; - out << "GL::Shader::compile(): compilation of" << shaderName(_type) << "shader" - << "succeeded with the following message:" << Debug::newline << message; + } else if(messageTrimmed) { + Warning{} << "GL::Shader::compile(): compilation of" << shaderName(_type) + << "shader succeeded with the following message:" << Debug::newline + << messageTrimmed; } return success;